Как сделать запрос с использованием поля из первого связанного объекта в 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
Вернуться на верх