2015-10-01 7 views
1

Если внешние ключи, которые определяют отношение многих ко многим, необходимы в любом случае, есть ли какие-либо дополнительные затраты на уровне базы данных, чтобы сообщить Django, что они определяют много- для многих "через" отношения? Кроме того, может ли внешний ключ оставаться в этом случае недействительным?Стоимость отношений 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 через засыпи. Учитывая, что один из внешних ключей обнуляемая, я могу сделать M2M явного добавления

class ItemDesc(models.Model) 
    production_records = models.ManyToManyField(ProductionRecord, 
      through='StockLine') 

и если я могу, есть ли дополнительные расходы на уровне базы данных, или это изменение чисто на уровне Django ORM ? Это не существенное отношение, чтобы сделать явным, и это не будет сильно использоваться, но это, безусловно, упростит программирование.

ответ

1

Не должно быть никаких проблем с полями , потому что это просто означает, что они могут иметь нуль как значение, а не то, что им нужно. Поэтому они остаются пригодными для отношений «многие ко многим».
Имейте в виду restrictions for intermediate model, и все должно быть хорошо. На уровне базы данных вы получите дополнительную таблицу, если не использовать промежуточную модель, поскольку Django нуждается в дополнительной таблице для отношений «многие-ко-многим», тогда как с аргументом «сквозной» используется промежуточная модель Таблица.
Не следует влиять на SQL-запрос (относительно производительности).

Как правило, я бы рекомендовал, чтобы ваши модели соответствовали вашим проектам в реальной логике, поэтому используйте промежуточную модель, если это уместно.

Смежные вопросы