如何正确地在Django中查询与AnonymousUser的关系?

时间:2019-06-23 12:41:24

标签: python django django-models django-orm

我所拥有的:

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.idNoneuser_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对于任何给定字段均无效。

现在的问题是:一般处理这种查询的标准方法是什么?

0 个答案:

没有答案