6
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()
Tomasz Jakub Rup
  • 10,502
  • 7
  • 48
  • 49
user3207076
  • 111
  • 3
  • 5
  • 1
    Please show your models first. – alecxe Jan 17 '14 at 14:52
  • Don't just say, "this doesn't work", please include the traceback. In this case, the traceback is `SyntaxError: non-keyword arg after keyword arg`, which explains exactly what is going on. – Alasdair Jan 17 '14 at 15:03

3 Answers3

12

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))
Alasdair
  • 298,606
  • 55
  • 578
  • 516
1
g = Goal.objects.filter(Q(user__iexact=request.user) & Q(title__contains=term) | Q(desc__contains=term))

Use & in place of Python and operator

Yogesh dwivedi Geitpl
  • 4,252
  • 2
  • 20
  • 34
1

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.

Premkumar chalmeti
  • 800
  • 1
  • 8
  • 23