gpt4 book ai didi

Django比较两个对象的值

转载 作者:行者123 更新时间:2023-12-04 15:45:32 24 4
gpt4 key购买 nike

我有一个看起来像这样的 Django 模型:

class Response(models.Model):
transcript = models.TextField(null=True)

class Coding(models.Model):
qid = models.CharField(max_length = 30)
value = models.CharField(max_length = 200)
response = models.ForeignKey(Response)
coder = models.ForeignKey(User)

对于每个 Response 对象,有两个 qid = "risk"的编码对象,一个用于编码器 3,一个用于编码器 4。我希望能够做的是获取所有 Response 对象的列表,这些对象的值存在差异编码器 3 和编码器 4 之间的值大于 1。值字段存储数字 1-7。

事后我意识到将 value 设置为 CharField 可能是一个错误,但希望我能解决这个问题。

我相信像下面的 SQL 会做我正在寻找的东西,但我宁愿用 ORM 来做这件事
SELECT UNIQUE c1.response_id FROM coding c1, coding c2
WHERE c1.coder_id = 3 AND
c2.coder_id = 4 AND
c1.qid = "risk" AND
c2.qid = "risk" AND
c1.response_id = c2.response_id AND
c1.value - c2.value > 1

最佳答案

from django.db.models import F
qset = Coding.objects.filter(response__coding__value__gt=F('value') + 1,
qid='risk', coder=4
).extra(where=['T3.qid = %s', 'T3.coder_id = %s'],
params=['risk', 3])
responses = [c.response for c in qset.select_related('response')]

当您连接到查询中已经存在的表时,ORM 将为第二个分配一个别名,在本例中为 T3,您可以在参数中使用该别名 extra() .要找出别名是什么,您可以放入 shell 和 print qset.query .

请参阅 F objects 上的 Django 文档和 extra

更新:看来您实际上不必使用 extra() ,或者弄清楚django使用的别名是什么,因为每次你引用 response__coding在您的查找中,django 将使用最初创建的别名。这是寻找任一方向差异的一种方法:
from django.db.models import Q, F
gt = Q(response__coding__value__gt=F('value') + 1)
lt = Q(response__coding__value__lt=F('value') - 1)
match = Q(response__coding__qid='risk', response__coding__coder=4)
qset = Coding.objects.filter(match & (gt | lt), qid='risk', coder=3)
responses = [c.response for c in qset.select_related('response')]

请参阅 Q objects 上的 Django 文档

顺便说一句,如果你想要两个 Coding 实例,你在这里有一个 N + 1 查询问题,因为 django 的 select_related()不会得到反向 FK 关系。但是由于您已经在查询中获得了数据,您可以使用上述 T3 别名和 extra(select={'other_value':'T3.value'}) 检索所需信息。 . value来自相应编码记录的数据可以作为检索到的编码实例的属性访问,即作为 c.other_value .

顺便说一句,您的问题已经足够笼统,但看起来您有一个实体-属性-值模式,这在 RDB 场景中通常被认为是反模式。使用 risk 长期使用可能会更好(这个查询会更简单) field :
class Coding(models.Model):
response = models.ForeignKey(Response)
coder = models.ForeignKey(User)
risk = models.IntegerField()
# other fields for other qid 'attribute' names...

关于Django比较两个对象的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16501346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com