如何使用Subquery使用其他对象注释Django QuerySet

时间:2017-06-27 14:57:23

标签: python django

在Django 1.11版中,添加了Subquery expressions。我希望使用此功能根据某些过滤器选择相关的模型对象。

这是documentation

的示例
from django.db.models import OuterRef, Subquery
newest = Comment.objects.filter(post=OuterRef('pk')).order_by('-created_at')   
Post.objects.annotate(newest_commenter_email=Subquery(newest.values('email')[:1]))

我想做同样的事情,但在这种情况下,我不想仅使用“newest_commenter_email”进行注释,而是希望整个Comment对象保存为newest_comment注释,像这样:

from django.db.models import OuterRef, Subquery
newest = Comment.objects.filter(post=OuterRef('pk')).order_by('-created_at')   
Post.objects.annotate(newest_comment=Subquery(newest[:1]))

但是,这会导致以下错误:

FieldError: Expression contains mixed types. You must set output_field

有解决方法吗?

1 个答案:

答案 0 :(得分:0)

您在子查询中忽略了values,请尝试以下操作:

Post.objects.annotate(newest_commenter=Subquery(newest.values('author')[:1]))

其中'author'是评论模型中的“评论者”字段。