2017-01-03 59 views
1

我有一個外部數據庫,我無法以任何方式修改(只讀)。它有三個表 - Companyid),CompanyContactcompany_idcontact_id),Contactidcompany_id)。Django將兩個表合併成單個模型

基本上,Contact有一個空的外鍵來Company表和它的作品爲多到一個,但如果COMPANY_ID是null,我要看看CompanyContact表,這是許多一對多的那種關係。

如何將這兩個表(ContactCompanyContact)合併到一個模型中 - 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字段是不正確的。這不必要地使所有查詢複雜化(原始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

你是對的,我有那些結構不正確的表,但我無能爲力(我的猜測,他們已被設置爲向後兼容)。爲多對多關係添加另一個模型來映射列名似乎解決了我的問題,但我仍然需要將這兩個公司字段合併到一起。 –