Как сделать запрос с использованием поля из первого связанного объекта в Django?
У меня есть следующие модели:
class User(models.Model):
username = models.CharField(max_length=255, unique=True)
display_name = models.CharField(max_length=255)
...
class Profile(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=255)
В представлении у меня есть параметр под названием keyword
. Я пытаюсь запросить таблицу User
для любых пользователей, которые содержат keyword
в поле username
OR display_name
, AND также поле name
первого связанного профиля. Надеюсь, это имеет смысл. Есть ли способ сделать это в одном единственном запросе? У некоторых пользователей может не быть профилей, поэтому это тоже нужно учесть.
На данный момент у меня есть следующее:
from django.db.models import Q
def get_queryset(keyword):
qs = User.objects.all()
qs = qs.filter(Q(username__icontains=keyword), Q(display_name__icontains=keyword))
return qs
Спасибо за любую помощь!
Я не смог протестировать это, и, вероятно, это не будет работать при первом запуске, но это может быть хорошей отправной точкой. Я также не уверен в производительности, но вы можете сообщить мне, когда попробуете это, и я смогу исправить код. Было бы неплохо иметь минимальный воспроизводимый пример для этого.
from django.db.models import Q, OuterRef, Subquery
def get_queryset(keyword):
first_profile = Profile.objects.filter(user_id=OuterRef('id'))
qs = User.objects.filter(Q(username__icontains=keyword) | Q(display_name__icontains=keyword)).annotate(first_profile_name=Subquery(first_profile.values('name')[:1])).filter(Q(first_profile_name=None) | Q(first_profile_name__icontains=keyword))
return qs