Django中ManyToMany关系的行内编辑

4 投票
1 回答
3219 浏览
提问于 2025-04-15 15:54

在完成Django的教程后,我现在想创建一个非常简单的发票应用程序。

我想在发票中添加多个产品,并在Django管理后台的发票表单中指定每种产品的数量。现在,如果我有同一种产品的不同数量,我就必须创建一个新的产品对象。

目前我的模型看起来是这样的(公司和客户模型省略了):

class Product(models.Model):
    description = models.TextField()
    quantity = models.IntegerField()
    price = models.DecimalField(max_digits=10,decimal_places=2)
    tax = models.ForeignKey(Tax)

class Invoice(models.Model):
    company = models.ForeignKey(Company)
    customer = models.ForeignKey(Customer)
    products = models.ManyToManyField(Product)
    invoice_no = models.IntegerField()
    invoice_date = models.DateField(auto_now=True)
    due_date = models.DateField(default=datetime.date.today() + datetime.timedelta(days=14))

我想数量应该不放在产品模型里,但我该怎么在发票模型中为它创建一个字段呢?

1 个回答

9

你需要稍微调整一下你的模型结构。正如你所意识到的,数量这个信息并不应该放在产品模型里,而是应该放在产品和发票之间的关系中。

在Django中,你可以使用一个带有through表的多对多关系来实现这个功能:

class Product(models.Model):
    ...

class ProductQuantity(models.Model):
    product = models.ForeignKey('Product')
    invoice = models.ForeignKey('Invoice')
    quantity = models.IntegerField()

class Invoice(models.Model):
    ...
    products = models.ManyToManyField(Product, through=ProductQuantity)

撰写回答