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