Reputation: 139
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
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
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