user3207076
user3207076

Reputation: 111

Q objects in django queryset

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

How can I add to my filter that user=request.user?

This doesn't work:

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

Models:

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

Upvotes: 6

Views: 6356

Answers (3)

Premkumar chalmeti
Premkumar chalmeti

Reputation: 1018

According to django docs.

Lookup functions can mix the use of Q objects and keyword arguments. However, if a Q object is provided, it must precede the definition of any keyword arguments.

Upvotes: 1

Yogesh dwivedi Geitpl
Yogesh dwivedi Geitpl

Reputation: 4462

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

Use & in place of Python and operator

Upvotes: 1

Alasdair
Alasdair

Reputation: 308779

Keyword arguments (user=request.user) must come after non keyword arguments (your Q object).

Either switch the order in your filter:

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

or chain two filter() calls together

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

Upvotes: 12

Related Questions