{{{
editable_ones = ..... # another queryset
result =
MyModel.objects.annotate(editable=ExpressionWrapper(Q(pk__in=editable_child_folders),
output_field=BooleanField())
}}}
As soon as {{{editable_ones}}} is empty, {{{result}}} is also empty.
Reading the docs, I guess this is not desired behavior
(https://docs.djangoproject.com/en/1.9/ref/models/querysets/#annotate).
--
Ticket URL: <https://code.djangoproject.com/ticket/26517>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* needs_better_patch: => 0
* needs_tests: => 0
* needs_docs: => 0
Old description:
> We use the ExpressionWrapper + annotate to annotate specific boolean
> values to all queried instances like this (minimal working example):
>
> {{{
> editable_ones = ..... # another queryset
> result =
> MyModel.objects.annotate(editable=ExpressionWrapper(Q(pk__in=editable_child_folders),
> output_field=BooleanField())
> }}}
>
> As soon as {{{editable_ones}}} is empty, {{{result}}} is also empty.
> Reading the docs, I guess this is not desired behavior
> (https://docs.djangoproject.com/en/1.9/ref/models/querysets/#annotate).
New description:
We use the ExpressionWrapper + annotate to annotate specific boolean
values to all queried instances like this (minimal working example):
{{{
editable_ones = ..... # another queryset
result =
MyModel.objects.annotate(editable=ExpressionWrapper(Q(pk__in=editable_ones),
output_field=BooleanField())
}}}
As soon as {{{editable_ones}}} is empty, {{{result}}} is also empty.
Reading the docs, I guess this is not desired behavior
(https://docs.djangoproject.com/en/1.9/ref/models/querysets/#annotate).
--
--
Ticket URL: <https://code.djangoproject.com/ticket/26517#comment:1>
Comment (by srkunze):
I did some further analysis:
{{{
MyModel.objects.annotate(editable=ExpressionWrapper(Q(pk__in=MyModel.objects.none()),
output_field=BooleanField())
}}}
{{{
MyModel.objects.annotate(editable=ExpressionWrapper(Q(pk__in=MyModel.objects.filter(pk=-1)),
output_field=BooleanField())
}}}
Both results differ.
{{{MyModel.objects.none()}}} forces the outer query to return an empty
QuerySet.
--
Ticket URL: <https://code.djangoproject.com/ticket/26517#comment:2>
* version: 1.8 => master
* stage: Unreviewed => Accepted
Comment:
Related to or duplicate of both #26430 and #26433.
--
Ticket URL: <https://code.djangoproject.com/ticket/26517#comment:3>
* has_patch: 0 => 1
Comment:
[https://github.com/django/django/pull/6638 PR]
--
Ticket URL: <https://code.djangoproject.com/ticket/26517#comment:4>
Comment (by jarshwah):
FYI ExpressionWrapper was never meant to be used to wrap up Q() objects.
Q() are not really expressions themselves, they just implement some of the
same API internally.
You're much better off using Case Expressions
https://docs.djangoproject.com/en/1.9/ref/models/conditional-expressions/
for this use case:
{{{
MyModel.objects.annotate(editable=Case(When(pk__in=[editable], then=1),
default=0, output_field=BooleanField()) )
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/26517#comment:5>
* needs_better_patch: 0 => 1
--
Ticket URL: <https://code.djangoproject.com/ticket/26517#comment:6>
* needs_better_patch: 1 => 0
--
Ticket URL: <https://code.djangoproject.com/ticket/26517#comment:7>
* stage: Accepted => Ready for checkin
--
Ticket URL: <https://code.djangoproject.com/ticket/26517#comment:8>
* status: new => closed
* resolution: => fixed
Comment:
In [changeset:"c002a0d39f18694f5e8a07d86684fc793b063056" c002a0d3]:
{{{
#!CommitTicketReference repository=""
revision="c002a0d39f18694f5e8a07d86684fc793b063056"
Fixed #26517 -- Fixed ExpressionWrapper with empty queryset.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/26517#comment:9>