Relational fields in Django models

Cuando comienzas con un nuevo proyecto en Django, una de las primeras cosas que debes hacer es definir cómo serán los modelos que usarás.

Un modelo de Django representa entidades del mundo real. Estas enditades no son intdependientes de otras

Django admite bases de datos relacionales (MySQL, PostgreSQL, principalmente) y nos permiten establecer relaciones entre diferentes modelos.

Existen tres tipos de campos relacionales que admiten Django.

1.- Many-to-one fields (relación de muchos a uno)

Se utiliza cuando un registro de un modelo A está relacionado con varios registros de otro modelo B.

En el siguiente ejemplo, tenemos un modelo llamado Song que tiene una relación de varios a uno con un modelo Album, es decir, un álbum puede tener muchas canciones, pero una canción no puede formar parte de varios álbumes. Las relaciones de varios a uno se definen mediante el campo de ForeignKey.

from django.db import models

class Album(models.Model):
	title = models.CharField(max_length = 100)
	artist = models.CharField(max_length = 100)

class Song(models.Model):
	title = models.CharField(max_length = 100)
	album = models.ForeignKey(Album, on_delete = models.CASCADE)

2.- Many-to-many fields (relación de muchos a muchos)

Se utiliza cuando un registro de un modelo A está relacionado con varios registros de otro modelo B y viceversa.

Por ejemplo, un modelos llamado Book tiene una relación de varios a varios con un modelo Autor, es decir, un libro puede ser escrito por varios autores y un autor puede escribir varios libros.

Las relaciones de varios a varios se definen mediante el ManyToManyField.

from django.db import models

class Author(models.Model):
	name = models.CharField(max_length = 100)
	desc = models.TextField(max_length = 300)

class Book(models.Model):
	title = models.CharField(max_length = 100)
	desc = models.TextField(max_length = 300)
	authors = models.ManyToManyField(Author)

3.- One-to-one fields (relación de uno a uno)

Se usa cuando un registro de un modelo A está relacionado exactamente con un registro de otro modelo B. Este campo puede ser útil como clave primaria de un objeto si ese objeto extiende a otro objeto de alguna manera.

Por ejemplo, un modelo Car tiene una relación de uno a uno con un modelo Vehicle, es decir, un Car es un Vehicle. Las relaciones uno a uno se definen mediante el OneToOneField

from django.db import models

class Vehicle(models.Model):
	reg_no = models.IntegerField()
	owner = models.CharField(max_length = 100)

class Car(models.Model):
	vehicle = models.OneToOneField(Vehicle, on_delete = models.CASCADE, primary_key = True)
	car_model = models.CharField(max_length = 100)

Opciones de integridad de datos

Dado que estamos creando modelos que dependen de otros modelos, necesitamos definir el comportamiento de un registro en un modelo cuando se elimina el registro correspondiente en el otro. Esto se logra agregando un parámetro opcional en el campo relacional, que puede tomar los siguientes valores:on_delete.

  • on_delete = models.CASCADE Este es el valor predeterminado. Elimina automáticamente todos los registros relacionados cuando se elimina un registro (por ejemplo, cuando se elimina un registro de Album, se eliminarán todos los registros de Song relacionada)
  • on_delete = models.PROTECT Esta opción bloquea la eliminación de un registro que tiene relación con otros registros (por ejemplo, se bloqueará cualquier intento de eliminar un registro de Album)
  • on_delete = models.SET_NULL Asigna NULL al campo relacional cuando se elimina un registro, siempre que se establezca .null = True.
  • on_delete = models.SET_DEFAULT Asigna valores predeterminados al campo relacional cuando se elimina un registro, se debe proporcionar un valor predeterminado.
  • on_delete = models.SET() Puede tomar un valor predeterminado como parámetro o un invocable, cuyo valor de retorno se asignará al campo.
  • on_delete = models.DO_NOTHING No realiza ninguna acción. Es una mala práctica utilizar este valor.

Referencia: geeksforgeeks

Deja una respuesta

Tu dirección de correo electrónico no será publicada.