Django Запрос, когда одно поле повторяется, а другое отличается - PullRequest
1 голос
/ 25 февраля 2020

Я хочу знать, могу ли я создать запрос, в котором одно поле повторяется, а другое отличается.

В основном я хочу получить все имена пользователей, где First Name одинаково, а user_id различно , Я сделал это

UserNames.objects.values("first_name", "user_id").annotate(ct=Count("first_name")).filter(ct__gt=0)

Это вернет список со всеми пользователями

После этого я делаю некоторую постобработку и создаю другой запрос, где я фильтрую только пользователей с first_name__in=['aaa'] & user_id__in=[1, 2], чтобы получить пользователи с одинаковыми first_name, но разными user_id

Могу ли я сделать это только одним запросом? или лучше?

1 Ответ

3 голосов
/ 25 февраля 2020

Вы можете работать с подзапросом здесь, но это не будет иметь большого значения с точки зрения производительности, я думаю:

from django.db.models import Exists, OuterRef, Q

UserNames.objects.filter(
    <b>Exists(</b>UserNames.objects.filter(
        ~Q(user_id=OuterRef('user_id')),
        first_name=OuterRef('first_name')
    )<b>)</b>
)

или до :

from django.db.models import Exists, OuterRef, Q

UserNames.objects.annotate(
    has_other=<b>Exists(</b>UserNames.objects.filter(
        ~Q(user_id=OuterRef('user_id')),
        first_name=OuterRef('first_name')
    )<b>)</b>
).filter(has_other=True)

Таким образом, мы сохраняем UserNames объекты, для которых существует UserNames объект с тем же first_name и с другим user_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...