2014-01-17 2 views
4
g = Goal.objects.filter(Q(title__contains=term) | Q(desc__contains=term)) 

Как добавить к моему filter, что user=request.user?Q объектов в django queryset

Это не работает:

g = Goal.objects.filter(user=request.user, Q(title__contains=term) | Q(desc__contains=term)) 

Модели:

class Goal(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField(max_length=255) 
    desc = models.TextField() 
+1

Пожалуйста, сначала покажите свои модели. – alecxe

+0

@alecxe Я обновил вопрос – user3207076

+0

Не просто сказать, что «это не работает», пожалуйста, включите трассировку. В этом случае трассировка - это 'SyntaxError: non-keyword arg after keyword arg', в котором точно объясняется, что происходит. – Alasdair

ответ

8

аргументы Ключевое слово (user=request.user) должны прийти после аргументы, не ключевое слово (ваш Q объект).

Либо изменить порядок в фильтре:

Goal.objects.filter(Q(title__contains=term) | Q(desc__contains=term), user=request.user) 

или цепь двух filter() созовет

Goal.objects.filter(user=request.user).filter(Q(title__contains=term) | Q(desc__contains=term)) 
1
g = Goal.objects.filter(Q(user__iexact=request.user) & Q(title__contains=term) | Q(desc__contains=term)) 

Использование & вместо Python и оператора

0

Согласно Джанго docs.

Функции поиска могут смешивать использование объектов Q и аргументов ключевых слов. Однако, если объект Q предоставлен, он должен предшествовать определению любых аргументов ключевого слова.

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