Python “Django多对多”的成本;透过「;关系
如果定义多对多关系的外键是必需的,那么在数据库级别告诉Django它们定义了多对多“直通”关系是否会有额外的成本?此外,在这种情况下外键是否可以保持为空 必须有什么:Python “Django多对多”的成本;透过「;关系,python,django,database,python-3.x,Python,Django,Database,Python 3.x,如果定义多对多关系的外键是必需的,那么在数据库级别告诉Django它们定义了多对多“直通”关系是否会有额外的成本?此外,在这种情况下外键是否可以保持为空 必须有什么: class StockLine( models.Model) # a line of stock (ie a batch) # one or other of the following two is null depending on # whether Stockline was m
class StockLine( models.Model) # a line of stock (ie a batch)
# one or other of the following two is null depending on
# whether Stockline was manufactured in-house or bought in.
# (maybe both if it's been in stock "forever", no computer records)
production_record = models.ForeignKey('ProductionRecord',
null=True, blank=True)
purchase_order = models.ForeignKey('PurchaseOrder',
null=True, blank=True)
itemdesc = models.ForeignKey('ItemDesc')
# other fields ...
class ItemDesc( models.Model) # a description of an item
# various fields
class ProductionRecord( models.Model) # desc of a manufacturing process
# various fields
ProductionRecord和ItemDesc之间通过StockLine存在一种隐含的多对多关系。假设其中一个外键可以为null,我可以通过添加
class ItemDesc( models.Model)
production_records = models.ManyToManyField(ProductionRecord,
through='StockLine')
如果可以的话,在数据库级别是否有任何额外的成本,或者这种更改纯粹是在Django ORM级别?这不是显式的必要关系,也不会被大量使用,但它肯定会使编程更容易。可空字段不应该有任何问题,因为这只是意味着它们可以将null作为一个值,而不是必须。因此,它们仍然适用于多对多关系。
记住这一点,你会没事的。在数据库级别,如果不使用中间模型,您将得到一个额外的表,因为Django需要一个额外的表来处理多对多关系,而使用“through”参数则使用中间模型的表。
SQL查询不应受到影响(关于性能) 一般来说,我建议您的模型遵循项目的实际逻辑,因此如果合适的话,请使用中间模型