Mehran Bahrami
Mehran Bahrami

Reputation: 139

Calling related name models in query (Q) "Django"

I have profile model like :

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile")
    first_name = models.CharField(max_length=30, blank=True, null=True)
    last_name = models.CharField(max_length=30, blank=True, null=True)

and I have a search view like :

def users_search_view(request):
    query = request.GET.get('q')
    users = User.objects.filter(Q(email__icontains=query)|Q(username__icontains=query),is_superuser=False,is_staff=False)
    ctx = {'users':users,
    'q':query}
    return render(request,"staff/users_search.html", ctx) 

I want to have search by first name and also last name from Profile model, in my search, How can I make something like Q(email__icontains=query) for related modals ?

Upvotes: 0

Views: 201

Answers (2)

angardi
angardi

Reputation: 375

Just keep adding Q objects to your filter and use dunder (__) to access related fields.

E.g. User.objects.filter(Q(username__icontains=q) | Q(profile__first_name__icontains=q))

Upvotes: 1

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 477854

You can .filter(…) [Django-doc] with:

User.objects.filter(Q(profile__first_name__icontains=query) | Q(profile__last_name__icontains=query) | Q(email__icontains=query) | Q(username__icontains=query),is_superuser=False,is_staff=False)

One can use double underscores (__) to look "through" relations. This will result in a LEFT OUTER JOIN where we thus filter on the related Profile record for that User.

Upvotes: 1

Related Questions