Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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查询集中的重复对象_Python_Django_Duplicates_Django Queryset - Fatal编程技术网

Python 删除Django查询集中的重复对象

Python 删除Django查询集中的重复对象,python,django,duplicates,django-queryset,Python,Django,Duplicates,Django Queryset,这是一个我已经见过被问过几次的问题,但我真的找不到一个对我的问题有意义的解决方案 >>> query = ['software', 'engineer'] >>> hits = [] >>> for q in query: ... x = Vacancy.objects.filter(Q(job_title__icontains=q)) ... hits.append(x) ... >>> hits [<Q

这是一个我已经见过被问过几次的问题,但我真的找不到一个对我的问题有意义的解决方案

>>> 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>]>]
查询=['软件','工程师'] >>>点击次数=[] >>>对于查询中的q: ... x=空缺.objects.filter(Q(职位\职位\图标=Q)) ... hits.append(x) ... >>>击中 [, ] 我如何清理hits QuerySet,使其没有任何重复项

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

>>> hits = list(dict.fromkeys(hits))
>>> hits
[<QuerySet [<Vacancy: 6 Software Engineer>]>, <QuerySet [<Vacancy: 6 Software Engineer>]>]
点击次数=列表(dict.fromkeys(点击次数)) >>>击中 [, ]
@sarchixo-
空缺.对象.过滤器(Q(job\u title\u icontains=Q)).distinct()
。这行吗

只是为了更清楚。下面是distinct()在queryset上运行得非常好的快照。不确定您接收“列表对象没有不同属性”的原因


您可以在过滤器中链接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,我解决了它!! 与其使用过滤器不如使用获取,这样列表中的每个项目都不是一个查询集,而是一个空缺对象,易于访问

>>> 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>]
查询中的q的
>>:
...    x=空缺.objects.get(Q(职位\职位\图标=Q))
...    hits.append(x)
...
>>>击中
[, ]
>>>点击次数=列表(dict.fromkeys(点击次数))
>>>击中
[]

他没有存储重复的内容,而是对他的单词列表中的每个单词进行查询,并将结果添加到点击列表Yes中,这正是@iklinac所说的。我也尝试了.distinct(),但得到了一个属性错误
AttributeError:“list”对象没有属性“distinct”
@sarchi xo-在queryset上尝试distinct。它不会抛出错误。x=空缺.objects.filter(Q(job\u title\u icontains=Q)).distinct()@SDRJ你刚才重复了同样的事情,我已经告诉过你我试过了,但没有用@sarchi xo-我甚至自己测试过。添加到快照中。不确定您收到错误的原因。我导入了reduce,因为它出现了一个名称错误,但现在我收到另一个名称错误:
NameError:Name'或\未定义
或\来自operators模块。我添加了import语句,如果您在该模型中有大量数据,并且带有job_title='software engineer'的queryset返回10亿行,您将在命中列表中的内存中存储所有这些数据,那么会发生什么情况?queryset操作应尽可能通过使用内置筛选或编写自定义SQL。数据库速度更快,并且是针对这种情况建立的。@SDRJ我编辑了我的答案,因为我意识到没有必要专门访问作业标题。@sarchi xo-hits.append(x)。如果您的应用程序在增长,并且数据库中有大量数据,并且通过将这些数据存储在列表中,将所有这些数据追加到内存中,请考虑此列表。我不知道你正在使用的确切的用例,但从长远来看可能是值得考虑的。