删除 Django QuerySet 中的重复对象

Removing duplicate objects within a Django QuerySet

这个问题我已经问过几次了,但我找不到真正适合我的问题的解决方案。

>>> query = ['software', 'engineer']
>>> hits = []
>>> for q in query:
...    x = Vacancy.objects.filter(Q(job_title__icontains=q))
...    hits.append(x)
...
>>> hits
[<QuerySet [<Vacancy: 6 Software Engineer>]>, <QuerySet [<Vacancy: 6 Software Engineer>]>]

如何清理匹配查询集使其没有任何重复项?

我尝试了以下但没有成功:

>>> hits = list(dict.fromkeys(hits))
>>> hits
[<QuerySet [<Vacancy: 6 Software Engineer>]>, <QuerySet [<Vacancy: 6 Software Engineer>]>]

@sarchi-xo - Vacancy.objects.filter(Q(job_title__icontains=q)).distinct()。这个有用吗?

只是为了更清楚。这是 distinct() 在查询集上完美运行的快照。不确定您为什么会收到 'list object has no attribute distinct'

您宁愿在过滤器中链接 Q 个对象,而是对数据库生成单个查询

from functools import reduce
from operator import or_

words = ['software', 'engineer']
or_filter = reduce(or_, (Q(job_title__icontains=word) for word in words))


Vacancy.objects.filter(or_filter)

或者您可以在添加对象之前检查列表中是否已经有该对象,例如通过保留一组对象 ID

我解决了!! 与其使用 filter,不如使用 get,而不是列表中的每个项目都是一个 QuerySet,每个项目都是一个 Vacancy 对象,并且是易于访问。

>>> for q in query:
...    x = Vacancy.objects.get(Q(job_title__icontains=q))
...    hits.append(x)
...
>>> hits
[<Vacancy: 6 Software Engineer>, <Vacancy: 6 Software Engineer>]
>>> hits = list(dict.fromkeys(hits))
>>> hits
[<Vacancy: 6 Software Engineer>]

转换为集合,然后再次转换为列表

hits=list(set(hits))
>>> hits
[<Vacancy: 6 Software Engineer>]