微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django 查询失败,_id 未使用、创建或引用

如何解决Django 查询失败,_id 未使用、创建或引用

我以前使用过查询集,尽管这是我第一次尝试 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

解决方法

A ForeignKey 自然需要数据库表中的一列。由于 site_name 本身是主键,因此您应该在此处将其用作 ForeignKey,事实上,这需要是 OneToOneField [Django docs] 而不是 ForeignKey,因为它也是主键并且必须是唯一的:

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'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。