I have a model in which I was trying to get a count for records that 
matched three variable values and found an interesting edge case not in the 
documents 
for conditional expressions 
<https://docs.djangoproject.com/en/1.11/ref/models/conditional-expressions/#when>.
  
Specifically, if you have to use a Q expression for a not query, you can't 
mix them with lookups.

This is all on Django 1.8 with python 2.7.12

for example, 

SomeModel.objects.aggregate(total = Count(Case(When(~Q(some_field__icontains 
= 'value'), field_two = 2, field_three = True, then = 1), output_field = 
IntegerField()))

will result in a TypeError

/home/jason/.virtualenvs/work/lib/python2.7/site-packages/django/db/models/expressions.pyc
 
in __init__(self, condition, then, **lookups)
    687             condition, lookups = Q(**lookups), None
    688         if condition is None or not isinstance(condition, Q) or 
lookups:
--> 689             raise TypeError("__init__() takes either a Q object or 
lookups as keyword arguments")
    690         super(When, self).__init__(output_field=None)
    691         self.condition = condition

TypeError: __init__() takes either a Q object or lookups as keyword 
arguments

However, moving the original to a full ANDed Q expression like 

query  = ~Q(some_field__icontains = 'value') & Q(field_two = 2) & Q(field_three 
= True)
SomeModel.objects.aggregate(total = Count(Case(When(query, then = 1), 
output_field = IntegerField()))

works fine.  I couldn't find anything specifically about this in the docs, 
so is this explicit behavior or an undocumented issue?

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/f374d9a9-f765-4cf0-9691-be90d13318a9%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to