Объекты Q в наборе запросов Django

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

Как я могу добавить в мой filter тот user=request.user?

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

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()

3 ответа

Решение

Ключевое слово аргументы (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))
g = Goal.objects.filter(Q(user__iexact=request.user) & Q(title__contains=term) | Q(desc__contains=term))

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

Согласно Django Docs.

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

Другие вопросы по тегам