我所拥有的:
def get_queryset(self):
user = self.request.user
return Entry.objects.prefetch_related('likers', 'dislikers', 'favers').annotate(
liked=ExpressionWrapper(Q(likers__id=user.id or 1), output_field=BooleanField()),
disliked=ExpressionWrapper(Q(dislikers__id=user.id or 1), output_field=BooleanField()),
faved=ExpressionWrapper(Q(favers__id=user.id or 1), output_field=BooleanField()),
)
基本上是(user_related__foo=user.foo or impossible_user_foo)
,可以防止不良行为。
我不知道这是一个错误还是我做错了什么,但
ExpressionWrapper(Q(user_related__id=user.id), output_field=BooleanField())
当user.id
为None
且user_related.all()
为空时,如示例中所示,给出True
:
>>> qs = Entry.objects.annotate(
... liked=ExpressionWrapper(Q(likers__id=None), output_field=BooleanField())
... )
>>>
>>> qs[0].likers.all()
<QuerySet []>
>>> qs[0].liked
True
>>>
我可以编写至少一个可以在每种情况下使用
的通用hack方法,nope = object()
Q(user_related__foo=getattr(user, 'foo', nope))
但这也行不通,因为nope对于任何给定字段均无效。
现在的问题是:一般处理这种查询的标准方法是什么?