Campos intermedios en Django | Python

Requisito previo: modelos de Django , campos relacionales en Django
En Django, existe una relación de muchos a muchos entre dos modelos A y B, cuando una instancia de A está relacionada con múltiples instancias de B, y viceversa. Por ejemplo: en un sistema de gestión de tiendas, un artículo y un cliente comparten una relación de muchos a muchos, ya que un cliente puede comprar varios artículos y varios clientes pueden comprar el mismo artículo. 

Sin embargo, puede haber algunos campos que no sean específicos del cliente, ni del artículo comprado, sino de la compra del artículo por parte del cliente. por ejemplo, cantidad comprada, fecha de compra, etc. Para almacenar tales datos intermedios, necesitamos modelos intermedios. Necesitamos especificar el modelo intermedio a través del parámetro en ManyToManyField.

Para nuestro ejemplo, el código se vería así.

Python3

from django.db import models
 
class Item(models.Model):
    name = models.CharField(max_length = 128)
    price = models.DecimalField(max_digits = 5, decimal_places = 2)
 
    def __str__(self):
        return self.name
 
class Customer(models.Model):
    name = models.CharField(max_length = 128)
    age = models.IntegerField()
    items_purchased = models.ManyToManyField(Item, through = 'Purchase')
 
    def __str__(self):
        return self.name
 
class Purchase(models.Model):
    item = models.ForeignKey(Item, on_delete = models.CASCADE)
    customer = models.ForeignKey(Customer, on_delete = models.CASCADE)
    date_purchased = models.DateField()
    quantity_purchased = models.IntegerField()

Ahora veamos cómo podemos crear instancias de nuestro modelo de compra. 

Python3

i = Item.objects.create(name = "Water Bottle", price = 100)
c = Customer.objects.create(name = "Abhishek", age = 21)
p = Purchase(item = i, customer = c, 
             date_purchased = date(2019, 7, 7), 
             quantity_purchased = 3)
   
p.save()

Python3

c.items_purchased.all()
<QuerySet [<Item: Water Bottle>]>

Python3

i.customer_set.all()
<QuerySet [<Customer: Abhishek>]>

Publicación traducida automáticamente

Artículo escrito por Abhishek De y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *