Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:从queryset by相关模型字段中删除重复项(分组依据)_Python_Django - Fatal编程技术网

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)