如果没有主键,如何在 Django 中建模数据库视图?

Posted

技术标签:

【中文标题】如果没有主键,如何在 Django 中建模数据库视图?【英文标题】:How can I model a database view in Django if it doesn't have a primary key? 【发布时间】:2021-07-23 12:17:40 【问题描述】:

我有一个通过外键关联 2 家公司的数据库视图,如下所示:

数据库公司视图:

  company1_id FK to Company,
  company2_id FK to Company,
  description text
where
  --- some company criteria ---

我在 Django 中尝试使用非托管模型:

class CompanyView(models.Model):
  company1 = models.ForeignKey(Company, related_name='company1_id', parent_link=True)
  company2 = models.ForeignKey(Company, related_name='company2_id', parent_link=True)
  description = models.TextField()

  class Meta:
    managed = False
    db_table = 'company_view'

对于我拥有的 Admin 类:

@admin.register(models.CompanyView)
class CompanyViewAdmin(AdvancedModelAdmin):
    list_display = ('company1', 'company2', 'description')

但管理页面抛出异常,如:

psycopg2.errors.UndefinedColumn:company_view.id 列不存在

拥有一个主 id 键是没有意义的,那么有什么办法可以解决这个问题吗? 谢谢

【问题讨论】:

我看不到添加 PK 的缺点。 AFAIK 你不能在没有 PK 的情况下使用 django admin。 谢谢。我通过制作unique_together = ('company1', 'company2') 来尝试此操作,然后迁移将其转换为 id 字段,该字段在视图中不存在,所以死路一条:( 【参考方案1】:

为什么不建立多对多关系?

company = models.ManyToManyField(Company)

看:https://docs.djangoproject.com/en/3.2/topics/db/examples/many_to_many/

这将解决您的问题,因为它使用对象实例。

【讨论】:

感谢您的回答。抱歉,我没有提到的是视图更复杂,其中 company1.type = 'aaa' 和 company2.no_employees 您尝试为 CompanyView 创建主键吗?发生了什么事? 我尝试制作一个像 text(company1_id) || 这样的“合成”id 键'_' || text(company2_id),它确实在管理员中显示数据,但是如果我单击项目,它会失败并出现类型错误,因为 Django 尝试执行查询“... where company_view.id = xxx_yyy' 期望整数 id 不是整数值。 .

以上是关于如果没有主键,如何在 Django 中建模数据库视图?的主要内容,如果未能解决你的问题,请参考以下文章

如果我必须首先导入旧数据,如何对 Django 时间戳建模?

如何在没有自动增量的情况下创建主键?

如何在DJANGO里,向有外键的DB里插入数据

Django 视图集没有属性“get_extra_actions”

Django:如何在urlpatterns中访问其他模型的主键?

Django admin save_model 没有在 Postgres 中推进主键