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,模型中的表格来自inspectdbsites 列仅用于外键,它不存在于表中。我希望得到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 未使用、未创建或未引用的主要内容,如果未能解决你的问题,请参考以下文章

如何确定中继查询是不是为空或未加载

基于参数选择的单个查询(如果或未提供)

WebRTC 数据通道未连接或未调用回调

接口申领失败:该平台不支持或未实现操作

关于哪些操作索引效果不佳或未使用

mfp cordova:此cordova子命令的实现失败或未提供:未定义