在Django中限制中间多人连接表的选择 背景

在Django中限制中间多人连接表的选择 背景,django,django-models,data-modeling,Django,Django Models,Data Modeling,我已经创建了三个Django模型Inventory、SalesOrder和Invoice,以对库存中的项目、这些项目的销售订单以及特定销售订单的发票进行建模。每个销售订单可以有多个项目,因此我使用了一个中间连接表-saleorderitems,使用到参数作为ManyToManyField。此外,允许对销售订单进行部分计费,因此我在与saleorder模型相关的Invoice模型中创建了一个ForeignKey,以便特定的销售订单可以有多个发票 这就是我偏离我通常看到的地方。我没有通过ManyTo

我已经创建了三个Django模型Inventory、SalesOrder和Invoice,以对库存中的项目、这些项目的销售订单以及特定销售订单的发票进行建模。每个销售订单可以有多个项目,因此我使用了一个中间连接表-
saleorderitems
,使用
参数作为
ManyToManyField
。此外,允许对销售订单进行部分计费,因此我在与
saleorder
模型相关的
Invoice
模型中创建了一个
ForeignKey
,以便特定的销售订单可以有多个发票

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

问题
  • 是否有更好的方法来建模仅允许发票上的项目是与发票的销售订单关联的项目的关系
  • 模型是否正确地包含了将发票项目限制为仅与发票销售订单关联的项目的逻辑?在国际海事组织,答案是“是”,因为[Django documentation][dj model doc]将模型描述为“关于您的数据的唯一、确定的数据源”
  • 如何将
    发票
    模型中的
    发票
    项目的可用选项限制为该特定
    发票
    销售订单
    模型中的
    销售订单
    项目,而不考虑通过管理页面或表单访问该模型
代码
将选项限制为
仅影响管理员页面。如果要更改普通ModelForm中的可用选项,则需要修改form字段的属性。

在我看来,限制InvoiceItems选项的逻辑应该在模型中处理,而不是在表单中处理。无论是在管理页面、表单还是任何地方,我只希望特定发票的InvoiceItems能够为发票的SalesOrder选择SalesItems。在Django 1.3中,limit_choices_to也适用于“普通”关系,而不仅仅是管理关系。
class Item(models.Model):
    item_num = models.SlugField(unique=True)
    default_price = models.DecimalField(max_digits=10, decimal_places=2,
        blank=True, null=True)

class SalesOrderItem(models.Model):
    item = models.ForeignKey(Item)
    sales_order = models.ForeignKey('SalesOrder')
    unit_price = models.DecimalField(max_digits=10, decimal_places=2)
    quantity = models.DecimalField(max_digits=10, decimal_places=4)

class SalesOrder(models.Model):
    customer = models.ForeignKey(Party)
    so_num = models.SlugField(max_length=40, unique=True)
    sales_order_items = models.ManyToManyField(Item, 
        through=SalesOrderItem)

class InvoiceItem(models.Model):
    item = models.ForeignKey(SalesOrderItem)
    invoice = models.ForeignKey('Invoice')
    unit_price = models.DecimalField(max_digits=10, decimal_places=2)
    quantity = models.DecimalField(max_digits=10, decimal_places=4)

class Invoice(models.Model):
    invoice_num = models.SlugField(max_length=25)
    sales_order = models.ForeignKey(SalesOrder)
    invoice_items = models.ManyToManyField(SalesOrderItem,
        through='InvoiceItem')