2015-07-21 3 views
0

У меня есть две модели, компания и контракт. Каждый контракт заключен между двумя компаниями. Теперь кажется, что между компанией и контрактом существует множество отношений ManyToMany, например. у компании может быть много контрактов, а контракт заключен между несколькими компаниями. Это верно? Если да, как это сделать, укажите в Django? Это через два внешних ключа в одной модели?Может ли отношение manytomany иметь два внешних ключа в Django?

class Company(models.Model): 
    company_name = models.CharField(max_length = 30) 
    address = models.CharField(max_length = 100) 
    website = models.CharField(max_length = 30) 
    email = models.EmailField(max_length = 30) 

class Contract(models.Model): 
    company_1 = models.ForeignKey(Company, related_name="%(app_label)s_%(class)s_related_company1") 
    company_2 = models.ForeignKey(Company, related_name="%(app_label)s_%(class)s_related_company2") 
    company = models.ManyToManyField(Company) 
    contract_date = models.DateField() 
    consideration = models.DecimalField(max_digit =10, decimal_places = 2) 

ответ

2

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

class Contract(models.Model): 
    company_1 = models.ForeignKey(Company, related_name="%(app_label)s_%(class)s_related_company1") 
    company_2 = models.ForeignKey(Company, related_name="%(app_label)s_%(class)s_related_company2") 
    # company = models.ManyToManyField(Company) 
    contract_date = models.DateField() 
    consideration = models.DecimalField(max_digit =10, decimal_places = 2) 

Если, однако, вы хотите контракт с участием более чем двух компаний, то вы удалите два ForeignKeys и использовать manytomany отношения как так. Аналогичным образом, это автоматически подразумевает, что конкретный контракт разделяется всеми компаниями, перечисленными в этих отношениях. Вы также можете получить доступ к контрактам конкретной компании через ее родственное имя.

class Contract(models.Model): 
    # company_1 = models.ForeignKey(Company, related_name="%(app_label)s_%(class)s_related_company1") 
    # company_2 = models.ForeignKey(Company, related_name="%(app_label)s_%(class)s_related_company2") 
    companies = models.ManyToManyField(Company, related_name=whatever_you_want) 
    contract_date = models.DateField() 
    consideration = models.DecimalField(max_digit =10, decimal_places = 2) 
+0

Спасибо! Я думаю, что ваше объяснение имеет смысл. – EarlyCoder

+0

Хорошо! Примите этот ответ, если у вас больше нет вопросов или разъяснений для других! Благодаря! –

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