限制Django中的ManyToMany中间联结表的选择

时间:2010-03-23 22:06:23

标签: django django-models data-modeling

背景

我创建了三个Django模型 - Inventory,SalesOrder和Invoice - 来模拟库存中的项目,这些项目的销售订单以及特定销售订单的发票。每个销售订单可以有多个项目,因此我使用了中间联结表 - SalesOrderItems - 使用through的{​​{1}}参数。此外,允许对销售订单进行部分结算,因此我在与ManyToManyField模型相关的ForeignKey模型中创建了Invoice,以便特定销售订单可以包含多个发票

这是我偏离我通常看到的地方。我没有通过SalesOrderInvoice模型与Item模型相关联,而是通过中介将ManyToManyField模型与Invoice中间联结表相关联联结表SalesOrderItem。我这样做是因为它更好地模拟了现实 - 我们的发票与销售订单相关联,并且只能包含与该销售订单相关的项目而不是库存中的任何项目。我承认,如果InvoiceItem的中间联结表与另一个ManyToManyField的中间联结表相关,那似乎很奇怪。

问题

  • 是否有更好的方法来模拟仅允许发票上的项目与发票的销售订单相关联的项目的关系?
  • 模型是否包含逻辑以将发票项目限制为仅与发票的销售订单关联的项目的正确位置? IMO,答案是肯定的,因为[Django文档] [dj-model-doc]将模型描述为“关于数据的单一,权威的数据来源。”
  • 如何将ManyToManyField模型中invoice_items的可用选项限制为该特定Invoice的{​​{1}}模型的sales_order_items无论如何通过管理页面或表格访问模型?

代码

SalesOrder

1 个答案:

答案 0 :(得分:1)

limit_choices_to仅影响管理页面。如果要更改普通ModelForm中的可用选项,则需要修改表单域的queryset属性。