首页 > 解决方案 > 一个字段重复而另一个字段不同的Django Query

问题描述

我想知道是否可以创建一个字段重复而另一个字段不同的查询。

基本上我想获得所有First Name相同和user_id不同的用户名。我做了这个

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

这将检索所有用户的列表

在 tis 之后,我进行了一些后期处理并创建了另一个查询,在其中我只过滤用户first_name__in=['aaa'] & user_id__in=[1, 2]以获得相同first_name但不同的用户user_id

我可以在一个查询中做到这一点吗?还是以更好的方式?

标签: pythonmysqldjango

解决方案


您可以在此处使用子查询,但我认为这在性能方面并不重要:

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

UserNames.objects.filter(
    Exists(UserNames.objects.filter(
        ~Q(user_id=OuterRef('user_id')),
        first_name=OuterRef('first_name')
    ))
)

或在之前:

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

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

因此,我们保留UserNames存在UserNames具有相同first_name和不同对象的对象user_id


推荐阅读