【问题标题】:Django union two tables into single modelDjango将两个表合并为单个模型
【发布时间】:2017-01-03 09:49:11
【问题描述】:

我有一个无法以任何方式修改的外部数据库(只读)。它有三个表 - Company (id), CompanyContact (company_id, contact_id), Contact (id, company_id)。

基本上,ContactCompany 表有一个可以为空的外键,它的工作原理是多对一,但如果 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 的模型。视图中没有可显示的内容,因为这基本上是我的问题,如何获取给定公司的联系人。

【问题讨论】:

  • 你能把你的问题中的表格/列弄乱吗
  • 向我们展示models.py并查看??

标签: django django-models


【解决方案1】:

您数据库中的原始表结构不正确。联系人字段应具有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

【讨论】:

  • 不确定我是否理解您的第一段关于具有contact_id 字段的联系人字段? Contact 表有一个 company_id 字段,(我猜这是由于历史原因造成的),但没有 contact_id 并且还有另一个表 CompanyContact 存储多对多关系。无论如何,我不能在那里修改任何东西,所以我需要解决它。
  • 你说得对,我有那些结构不正确的表格,但我对它们无能为力(我猜,它们被设置为向后兼容)。为多对多关系添加另一个模型来映射列名似乎可以解决我的问题,尽管我仍然必须将这两个公司字段合并在一起。
  • 您是否至少可以查看该表?
  • 是的,我可以添加视图。啊,总是忘记这个可能的解决方案(我想我现在就这样做)。谢谢!
  • 很高兴我提出来 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多