gpt4 book ai didi

python - Django:通过相关模型字段从查询集中删除重复项(分组依据)

转载 作者:行者123 更新时间:2023-11-28 21:36:43 29 4
gpt4 key购买 nike

我有一个带有几条记录的查询集,我不想使用相关的模型字段删除重复项。例如:

class User(models.Model):
group = models.ForeignKey('Group')
...

class Address(models.Model):
...
models.ForeignKey('User')

addresses = Address.objects.filter(user__group__id=1).order_by('-id')

这将返回地址记录的 QuerySet,我想按用户 ID 分组。

  • 我不能使用 .annotate 因为我需要 Address 中的所有字段,以及 Address 和 User 之间的关系
  • 我不能使用 .distinct(),因为它不起作用,因为所有地址都是不同的,我想要不同的用户地址。

我可以:

addresses = Address.objects.filter(user__group__id=1).order_by('-id')
unique_users_ids = []
unique_addresses = []

for address in addresses:
if address.user.id not in unique_users_ids:
unique_addresses.append(address)
unique_users_ids.append(address.user.id)

print unique_addresses # TA-DA!

但是对于像 group by(该死的 Django)这样简单的事情来说似乎太过分了。

有没有简单的方法来实现这一点?

最佳答案

通过使用带有字段名称的 .distinct()

Django 还有一个 .distinct(..)将应该唯一的列名作为输入列的函数。唉,大多数数据库系统不支持这个(据我所知,只有 PostgreSQL)。但是在 PostgreSQL 中我们可以这样执行:

# Limited number of database systems support this
addresses = (Address.objects
.filter(user__group__id=1)
.order_by('-id')
<b>.distinct('user_id')</b>)

通过使用两个查询

另一种处理方法是首先对用户进行查询,并为每个用户获取最大的 address_id:

<b>from django.db.models import Max</b>

address_ids = (User.objects
<b>.annotate(address_id=Max('address_set__id'))</b>
.filter(<b>address_id__isnull=False</b>)
.values_list(<b>'address_id'</b>))

所以现在对于每个用户,我们已经计算出最大的对应address_id,我们剔除没有地址的User。然后我们获得 id 的列表。

第二步,我们获取地址:

addresses = Address.objects.filter(<b>pk__in=address_ids</b>)

关于python - Django:通过相关模型字段从查询集中删除重复项(分组依据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50609341/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com