2017-01-03 114 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

你是对的,我有那些结构不正确的表,但我无能为力(我的猜测,他们已被设置为向后兼容)。为多对多关系添加另一个模型来映射列名似乎解决了我的问题,但我仍然需要将这两个公司字段合并到一起。 –