2017-01-03 1 views
1

У меня есть внешняя база данных, которую я никак не могу изменить (только для чтения). Он состоит из трех таблиц - Company (id), CompanyContact (company_id, contact_id), Contact (id, company_id).Django объединение двух таблиц в одну модель

В принципе, Contact имеет обнуляемого внешний ключ к Company столу, и она работает, как многие-к-одному, но если company_id является null, я должен смотреть в CompanyContact таблицу, которая многие-ко-многим рода отношения.

Как объединить эти две таблицы (Contact и CompanyContact) в одну модель - Contact? Другими словами, как я могу получить все контакты для данной компании?

В SQL, который будет что-то вроде:

select contact.id from contact where company_id = XXX union select contact_id from companycontact where company_id = XXX

модели Django:

class Company(models.Model): 
    uuid = models.CharField(max_length=36, primary_key=True, db_column='id') 

    class Meta: 
     managed = False 


class Contact(models.Model): 
    uuid = models.CharField(max_length=36, primary_key=True, db_column='id') 
    company = models.ForeignKey(Company, db_column='company_id') 

    class Meta: 
     managed = False 

у меня нет модели для CompanyContact. И нет ничего, чтобы показать в представлениях, потому что это в основном мой вопрос, как получить контакты для данной компании.

+0

вы можете прояснится таблица/столбец перепутать ваш вопрос пожалуйста – e4c5

+0

показать нам models.py и вид ?? –

ответ

0

Исходные таблицы в вашей базе данных не структурированы должным образом. Неправильно, что поле контакта должно иметь поле company_id. Это ненужно усложняет все запросы (raw SQL или Django), потому что в поле contact_id требуется дополнительная проверка.

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

class Contact(models.Model): 
    uuid = models.CharField(max_length=36, primary_key=True, db_column='id') 
    company = models.ForeignKey(Company, db_column='company_id') 
    companies = models.ManyToManyField(Company, related_name='companies') 


    class Meta: 
     managed = False 
+0

Не уверен, что я понял ваш первый абзац о поле контакта с полем contact_id? В таблице контактов есть поле company_id (которое, как я полагаю, связано с историческими причинами), но нет contact_id, и есть еще одна таблица CompanyContact, хранящая отношения «многие ко многим». В любом случае, я ничего не могу изменить, поэтому мне нужно обойти это. –

+0

Извините, что было исправлено company_id – e4c5

+0

Вы правы, у меня есть эти неправильно структурированные таблицы, но я ничего не могу с ними поделать (думаю, они были настроены так, чтобы быть обратно совместимыми). Добавление другой модели для отношения «многие ко многим», для сопоставления имен столбцов, похоже, решает мою проблему, хотя мне все равно нужно объединить эти два поля компании. –