Django模型 - 事后如何通过PK过滤出重复值?

wso*_*son 6 python django unique set data-structures

我通过进行多次查询来构建Django模型对象列表.然后我想删除任何重复项(所有这些对象都是auto_increment int PK的相同类型),但我不能使用set()因为它们不可清除.

有没有快速简便的方法来做到这一点?我正在考虑使用dict而不是以id作为键的列表.

use*_*478 12

通常,如果可能,最好将所有查询组合到单个查询中.IE浏览器.

q = Model.objects.filter(Q(field1=f1)|Q(field2=f2))
Run Code Online (Sandbox Code Playgroud)

代替

q1 = Models.object.filter(field1=f1)
q2 = Models.object.filter(field2=f2)
Run Code Online (Sandbox Code Playgroud)

如果第一个查询返回重复的模型,则使用distinct()

q = Model.objects.filter(Q(field1=f1)|Q(field2=f2)).distinct()
Run Code Online (Sandbox Code Playgroud)

如果您的查询确实无法使用单个命令执行,那么您将不得不求助于使用其他答案中推荐的字典或其他技巧.如果您在SO上发布确切的查询可能会有所帮助,我们可以看到是否可以组合成单个查询.根据我的经验,大多数查询都可以使用单个查询集完成.


Dav*_*ger 6

有没有快速简便的方法来做到这一点?我正在考虑使用dict而不是以id作为键的列表.

如果您被锁定在当前进行多次查询的结构中,那正是我要做的.然后简单地dictionary.values()返回你的清单.

如果你有更多的灵活性,为什么不使用Q对象?而不是实际进行查询,而是将每个查询存储在Q对象中,并使用按位或("|")来执行单个查询.这将实现您的目标并节省数据库命中率.

Django Q对象