如果没有主键,如何在 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 视图集没有属性“get_extra_actions”