如何从QuerySet中删除不同的值并同时保持pk?

时间:2016-10-18 12:18:08

标签: django django-orm

我正在使用包django_autocomplete_light

我有一个名为Tag的简单模型:

class Tag(models.Model):
    title = models.CharField(max_length=255)
选择所有代码时,

django_autocomplete_light会使用以下代码:

qs = Tag.objects.all()

这个问题是我正在构建的软件需要允许重复的标签(而不是我的决定)。这意味着如果有两个标签“男性”和“男性”,显然在QuerySet中会有重复。

我尝试通过更改查询来删除这些重复项,如下所示:

qs = Tag.objects.all().distinct()

但是我没有使用PostgreSQL,因此会导致错误。

因此我尝试了这种解决方法:

qs = Tag.objects.all().values_list('title', flat=True).distinct()

但这只会导致以下错误:

AttributeError: 'str' object has no attribute 'pk'

我尝试将查询更改为以下内容,但会导致另一个错误:

qs = Tag.objects.all().values_list('pk', 'title').distinct()

AttributeError: 'tuple' object has no attribute 'pk'

所以基本上我似乎需要保留id值,但不知何故删除了重复的标签。

不幸的是,我无法使用原始SQL查询,因为在以后的代码中,QuerySet会被多次处理。

有没有办法可以更改我的数据库查询,或者可能是从QuerySet手动删除重复项的方法?

任何帮助表示感谢。

谢谢。

1 个答案:

答案 0 :(得分:0)

解决方法可以是以下内容。 首先,获取Tag模型的所有标题并将其放入set

unique_titles = set(Tag.objects.values_list('title', flat=True))

现在,每个标签标题都是唯一的。 只需过滤掉unique_titles之类的标签:

unique_tags = Tag.objects.filter(title__in=unique_titles)