Python Django:从queryset by相关模型字段中删除重复项(分组依据)
我有一个包含两条记录的查询集,我不想使用相关模型字段删除重复项。例如:Python Django:从queryset by相关模型字段中删除重复项(分组依据),python,django,Python,Django,我有一个包含两条记录的查询集,我不想使用相关模型字段删除重复项。例如: 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') 这
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')
这将返回地址记录的查询集,我想按用户ID分组
- 我不能使用
,因为我需要地址中的所有字段,以及地址和用户之间的关系.annotate
- 我不能使用
,因为它不起作用,因为所有地址都是不同的,我需要不同的用户地址.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!
但对于一个简单的团体来说(该死的Django)似乎太难了
有没有一种简单的方法可以实现这一点?使用带有字段名的.distinct()
Django还有一个函数,它将列名作为输入列,列名应该是唯一的。唉,大多数数据库系统都不支持这一点(据我所知,只有PostgreSQL)。但在PostgreSQL中,我们可以执行以下操作:
# Limited number of database systems support this
addresses = (Address.objects
.filter(user__group__id=1)
.order_by('-id')
.distinct('user_id'))
现在,我们计算了每个用户对应的最大地址\u id
,并消除了没有地址的用户。然后我们获得id
s的列表
在第二步中,我们获取地址:
addresses = Address.objects.filter(pk__in=address_ids)
Address=Address.objects.filter(pk\uu in=Address\u id)
地址和组的关系如何?我们只看到地址
与用户
相关,而用户
与组相关,所以查询不是用户组id=1
?根本不相关。此外,我们不能执行按
分组,因为不清楚如何“聚合”超过多个地址。但是组id=1
查询没有多大意义。最新的:。order\u by('-id')
感谢这个人。我有一个非常具体的查询,使用filter()
,extra()
,order\u by()
,我需要按照特定的要求(我必须重复这个大查询集,但也要跟踪重复的内容,等等)将其全部删除(~1M条记录)。也许如果我有Django ORM的博士学位,我就可以完成它,但唯一现实的事情是用原始SQL重写它。但最终,只需进行两个查询,其中一个作为过滤器引用,就可以达到目的。
addresses = Address.objects.filter(pk__in=address_ids)