我有一个名为Group
的模型,另一个名为Reply
的模型包含一个属性,该属性是Group
的外键。此属性名为which_group
。
接下来,对于Group对象的查询集,我注释了一个名为 latest 的相关对象,它只是与每个对象相关的Max(reply__id)
。这个结果查询集我称为组。
接下来我做了以下事情:
values = tuple([(group.id, group.latest) for group in groups])
replies = Reply.objects.extra(where=['(which_group_id,id) IN %s' % (values)])
replies = list(replies)
return replies
我在群组中有一个对象的用户测试了此代码。它给我一个错误:
运算符不存在:record = integer 第1行:...... se" FROM" links_reply" WHERE((which_group_id,id)IN(1,52)...... ^ 提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。
我该如何解决这个问题?
P.S。我的数据库是Postgres(已知它是"强类型")
答案 0 :(得分:2)
我认为使用不同的查询更容易实现目标,而不是处理sql强制转换和额外语句。如果您需要获得按where_group_id值分组的回复并且其组的max(id),那么您需要尝试此查询
Reply.objects.values('which_group_id').annotate(Max('id'))
更新: 如果您需要包含每个组对象的最新回复的列表,您需要的是:
>>> ids = Reply.objects.values('which_group_id').annotate(Max('id'))
.values_list('id__max', flat=True)
>>> replies = Reply.objects.filter(id__in=ids)
答案 1 :(得分:0)
可能有误,但您的问题是由您的IN子句引起的。
(which_group_id,id)就SQL而言是一个不正确的表达式。将其拆分为2个AND子句,例如:which_group_id IN [values_list] AND id IN [values_list]