Django从queryset中删除重复项

时间:2014-05-12 10:51:51

标签: python django orm

我想删除相关字段中的重复项,我的查询集示例:

example = models.Object.objects.values('name', 'photo__name', 'url', 'photo__url').distinct()

if name == photo__name and url == photo_url我需要删除其中一个,如何使用Django ORM执行此操作或者需要迭代查询集?

2 个答案:

答案 0 :(得分:9)

如果您使用 PostgreSQL ,请查看Django docs on distinct()

  

仅在 PostgreSQL 上,您可以传递位置参数(*字段)以指定DISTINCT应应用的字段的名称...

     

指定字段名称时,您必须在QuerySet中提供order_by()order_by()中的字段必须以distinct()中的字段开头,顺序相同。

因此,在您的示例中,您可以使用以下方法删除某些字段上的重复项:

.order_by('photo__name', 'photo__url').distinct('photo__name', 'photo__url')

答案 1 :(得分:0)

要在过滤中引用模型的字段,您可以使用Django ORM F函数:https://docs.djangoproject.com/en/dev/topics/db/queries/#filters-can-reference-fields-on-the-model

但我想你无法删除其中一个 :)你必须决定你要删除哪一个

<强>更新

当您按照Object.objects.filter(photo__name='something')进行过滤时,请按相关照片名称过滤对象表。所以你处理两个表的连接。如果要排除名称=相关照片名称的对象,您应该执行类似这样的操作

from django.db.models import F
Object.objects.exclude(name=F('photo__name'))

这有用吗?