Что у меня есть:
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 недопустимо для любого данного поля.
Теперьвопрос заключается в следующем: каков стандартный способ обработки запросов такого рода?