2013-11-07 6 views
2

Я пытаюсь сделать довольно сложный запрос, где я могу исключить элементы, соответствующие определенному набору условий. Вот супер-упрощенная модель, чтобы объяснить мое затруднительное положение:Выполнение запроса «не в»

class Thing(models.Model) 
    user = models.ForeignKey(User) 
    shared = models.BooleanField() 
    number = models.IntegerField() 

я начинаю с QuerySet, который фильтрует Пользователь:

qs = Thing.objects.filter(user=request.user) 

Теперь из этого списка Thing, я хочу исключить любого пункты, где:

  • разделяемый Правда, и
  • п umber составляет не любое из значений [1, 6, 7].

В моей голове я сделаю:

qs = qs.exclude(shared=True, number__not__in=[1, 6, 7]) 

Но __not__in не существует, не так ли? Я чувствую, что мне нужно смешать это вокруг, чтобы пересечь два вопроса, но это кажется отвратительным для чего-то, что не может быть , что сложно. Каков мой лучший путь вперед?

ответ

4

согласно обсуждению на IRC с оп, может быть

qs = qs.exclude(Q (shared = True) && ~ Q (number__in=[1,6,7])) 
1

~Q

Это позволит мне сделать не-запрос, а затем я могу фильтровать что shared=True:

qs = qs.exclude(~Q(number__in=[1, 6, 7]), shared=True) 
+0

Я не уверен, что вы можете комбинировать выражение Q с выражением non Q в том же самом фильтре. – karthikr

+0

@karthikr. Вы можете, любые Q-группы должны идти первым, хотя. – Oli

Смежные вопросы