我有一个外部数据库,我无法以任何方式修改(只读)。它有三个表格 - Company
(id
),CompanyContact
(company_id
,contact_id
),Contact
(id
,{ {1}})。
基本上,company_id
对Contact
表有一个可以为空的外键,它与多对一有效,但如果company_id为Company
,我必须查看{{} 1}}表,这是多对多的关系。
如何将这两个表格null
和CompanyContact
)合并到一个模型中Contact
?换句话说,我如何获得给定公司的所有联系人?
在SQL中类似于:
CompanyContact
Django模特:
Contact
我没有select contact.id from contact where company_id = XXX
union
select contact_id from companycontact where company_id = XXX
的模型。并且没有什么可以在观点中显示,因为这基本上是我的问题,如何获得给定公司的联系人。
答案 0 :(得分: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