Django 查询失败,_id 未使用、未创建或未引用
Posted
技术标签:
【中文标题】Django 查询失败,_id 未使用、未创建或未引用【英文标题】:Django query fails with _id that is not used or created or referenced to 【发布时间】:2021-07-07 09:26:17 【问题描述】:虽然这是我第一次尝试 JOIN 表,但我之前使用过查询集,但到目前为止它还没有工作。 我正在使用 django 3.2 和 python 3.8.1
我的模型.py
class Mainjoinbook(models.Model):
fullsitename = models.TextField(primary_key=True)
creationdate = models.DateTimeField()
entrytypeid = models.BigIntegerField(blank=True, null=True)
title = models.TextField(blank=True, null=True)
tickettype = models.TextField(blank=True, null=True)
ticket = models.TextField(blank=True, null=True)
status = models.TextField(blank=True, null=True)
class Meta:
managed = False
db_table = 'mainlogbook'
class Sitelocation(models.Model):
site_name = models.TextField(primary_key=True)
latitude = models.TextField(blank=True, null=True)
longitude = models.TextField(blank=True, null=True)
sites = models.ForeignKey(Mainjoinbook, on_delete=models.DO_NOTHING)
class Meta:
managed = False
db_table = 'tblsiteaccess'
我正在尝试从我的 views.py 中加入的两个表中获取所有值
qrylocations = Sitelocation.objects.select_related('sites').filter(sites__status='OPEN')
这会导致此错误,因为该列是由 django 创建的,但不属于该表。我仍然无法解决如何解决这个问题,因为我尝试了很多选项,但总是遇到某种错误,我希望有人能帮助我看看我在加入定义的主键上的表时做错了什么
psycopg2.errors.UndefinedColumn: column tblsiteaccess.sites_id does not exist
显示的 SQL 输出如下。
来自 qrylocations.query 的输出
SELECT "tblsiteaccess"."site_name", "tblsiteaccess"."latitude", "tblsiteaccess"."longitude", "tblsiteaccess"."sites_id", "mainlogbook"."fullsitename", "mainlogbook"."log_id", "mainlogbook"."creationdate", "mainlogbook"."entrytypeid", "mainlogbook"."title", "mainlogbook"."tickettype", "mainlogbook"."ticket", "mainlogbook"."status" FROM "tblsiteaccess" INNER JOIN "mainlogbook" ON ("tblsiteaccess"."sites_id" = "mainlogbook"."fullsitename") WHERE "mainlogbook"."status" = OPEN
【问题讨论】:
这张表是您使用inspectdb
制作的吗?你知道表tblsiteaccess
中外键sites
的实际列名吗?
如果你创建了ForeignKey
,那么Django通常会在数据库中对应列的名称中添加_id
。
是的@AbdulAzizBarkat,模型中的表格来自inspectdb
。 sites
列仅用于外键,它不存在于表中。我希望得到JOIN ON "tblsiteaccess"."site_name" = "mainlogbook"."fullsitename"
,这显然是我做错了
@engstuff 这不是一个很好的主键 当一个人想要更改 Mainjoinbook
对象的名称时会发生什么?效率不高...
【参考方案1】:
ForeignKey
自然需要数据库表中的一列。由于site_name
本身是主键,因此您应该在这里将其用作ForeignKey
,实际上,而不是ForeignKey
,这需要是OneToOneField
[Django docs],因为它也是主键并且需要是唯一的:
class Sitelocation(models.Model):
site_name = models.OneToOneField(
Mainjoinbook,
on_delete=models.CASCADE,
primary_key=True,
db_column='site_name'
)
latitude = models.TextField(blank=True, null=True)
longitude = models.TextField(blank=True, null=True)
class Meta:
managed = False
db_table = 'tblsiteaccess'
【讨论】:
感谢@Abdul Aziz Barkat,正如我所说,我知道做错了什么,阅读所有文档让我更加困惑。这有助于我更好地理解外键的工作原理以上是关于Django 查询失败,_id 未使用、未创建或未引用的主要内容,如果未能解决你的问题,请参考以下文章