选择具有多个重复字段值的行
Posted
技术标签:
【中文标题】选择具有多个重复字段值的行【英文标题】:Select rows with multiple duplicate field values 【发布时间】:2021-03-09 04:41:03 【问题描述】:我想在 Django 中选择具有重复值的多行的行。
例如,我有一个看起来像这样的模型
class User:
first_name = models.CharField(...)
last_name = models.CharField(...)
...
还有一个像这样的数据库
first_name | last_name | ...
---------- | --------- | ...
Paul | Adams | ...
John | Smith | ...
Tom | Mueller | ...
John | Smith | ...
John | Adams | ...
Paul | Adams | ...
我想获得在数据库中多次存在的first_name
和last_name
值。其他值不能等于行数。在这个例子中,我想得到“John Smith”和“Paul Adams”。
【问题讨论】:
this 是您问题的答案吗? @Brambor 不,不是。我已经发现了这个问题,但它只适用于一个字段的值重复,而不是多个字段的值。 你不能只使用两次答案来过滤两列吗? 我试过了,还是不行,可能是我做错了什么。我可以稍后再试。 试试.values("first_field", "second_field")
【参考方案1】:
您可以在 views.py 或在您的 django shell 中使用 py manage.py shell
from django.db.models import Count
#import your User model
users_output = User.objects.values('first_name','last_name').annotate(first_name_count=Count('first_name'),last_name_count = Count('last_name')).filter(first_name_count__gt=1,last_name_count__gt=1)
上面的查询会返回一个类似这样的查询集
<QuerySet
['first_name': 'John', 'last_name': 'Smith', 'first_name_count': 2, 'last_name_count': 2,
'first_name': 'Paul', 'last_name': 'Adams', 'first_name_count': 2, 'last_name_count': 2]
>
【讨论】:
【参考方案2】:首先,你需要连接字段。
from django.db.models import Count, Value
from django.db.models.functions import Concat
queryset = User.objects.annotate(full_name=Concat('first_name', Value(' '), 'last_name', output_field=CharField())
那么您需要对每个唯一的全名进行分组并计算计数
queryset = queryset.values('full_name').annotate(full_name_count=Count('full_name'))
只过滤计数大于一的那些。
queryset = queryset.filter(full_name_count__gt=1)
【讨论】:
以上是关于选择具有多个重复字段值的行的主要内容,如果未能解决你的问题,请参考以下文章
使用 Activerecord、Rails 和 Postgres 查找具有多个重复字段的行