Как создать отношение «многие ко многим» в Django - PullRequest
0 голосов
/ 09 апреля 2020

Я новичок в Django, и я пытался создать модель, где у меня много складов и много продуктов. До сих пор я достиг этого:

class Product(models.Model):
  idProduct = models.IntegerField(primary_key=True)
  name = models.CharField(max_length=50)
  quantity = models.IntegerField()


  def __str__(self):
    return self.name

class Warehouse(models.Model):
  idWareouse = models.IntegerField(primary_key=True)
  name = models.CharField(max_length=50)
  address = models.CharField(max_length=100)
  city = models.CharField(max_length=50)
  products = models.ManyToManyField(Product)

  def __str__(self):
    return self.name

Но проблема в том, что один товар может находиться на нескольких складах с разным количеством товара, и я не знаю, как это смоделировать.

Спасибо

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Вы можете использовать атрибут through отношения ManyToMany. См. ЗДЕСЬ .

Это может привести к следующему:

class Product(models.Model):
    idProduct = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name

class Warehouse(models.Model):
    idWareouse = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=100)
    city = models.CharField(max_length=50)
    products = models.ManyToManyField(Product, through='Catalog')

    def __str__(self):
        return self.name

class Catalog(models.Model):
    products = models.ForeignKey(Product, on_delete=models.CASCADE)
    warehouse = models.ForeignKey(Warehouse, on_delete=models.CASCADE)
    quantity = models.IntegerField()

См. Поле products в классе Warehouse:

products = models.ManyToManyField(Product, through='Catalog')

В документации приведен полный пример .

1 голос
/ 09 апреля 2020

Я бы добавил третью модель:

class Product(models.Model):
    idProduct = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name

class Warehouse(models.Model):
    idWareouse = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=100)
    city = models.CharField(max_length=50)

    def __str__(self):
        return self.name

class Catalogue(models.Model):
    products = models.ForeignKey(Product)
    warehouse = models.ForeignKey(Warehouse)
    quantity = models.IntegerField()
...