删除 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>]
这个问题我已经问过几次了,但我找不到真正适合我的问题的解决方案。
>>> 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>]