Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “Django多对多”的成本;透过「;关系_Python_Django_Database_Python 3.x - Fatal编程技术网

Python “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

如果定义多对多关系的外键是必需的,那么在数据库级别告诉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 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查询不应受到影响(关于性能)

一般来说,我建议您的模型遵循项目的实际逻辑,因此如果合适的话,请使用中间模型