如何在 Django 中创建多对多关系

How to create a Many to Many Relation in Django

我是 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

但问题是,一个产品可以在多个不同数量的仓库中,我不知道如何建模。

谢谢

我要添加第三个模型:

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()

您可以使用 ManyToMany 关系的属性 through。参见 HERE

结果会是:

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()

请参阅 Warehouse class 中的 products 字段:

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

文档中有一个full example