Как правильно сделать запрос относительно AnonymousUser в Django? - PullRequest
0 голосов
/ 23 июня 2019

Что у меня есть:

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
>>>

Я былхорошо с написанием хотя бы общего хака, который будет работать в любой ситуации с чем-то вроде

nope = object()
Q(user_related__foo=getattr(user, 'foo', nope))

Но это также не работает, потому что nope недопустимо для любого данного поля.

Теперьвопрос заключается в следующем: каков стандартный способ обработки запросов такого рода?

...