检查queryset是否已存在

时间:2016-06-05 18:36:25

标签: python django duplicates

我有一个查询集列表,例如([qSet1, qSet2, qSet3],[qSet3, qSet2],[qSet1, qSet3])

然后,我想添加另一个查询集,但前提是它不在列表中。集可以具有相同的内容,但顺序不同:[qSet1, qSet2], [qSet2, qSet1]。该查询集必须被视为相同=>不得加两次。

我该怎么做?

2 个答案:

答案 0 :(得分:0)

如果要比较的是列表的内容,并且您不希望顺序产生影响,则应使用set

set([qSet1, qSet2]) == set([qSet2, qSet1])

这假设同一个查询集在同一个列表中不是两次。

答案 1 :(得分:0)

要检查一组QuerySets(双关语)的相同性,您可以使用Django为QuerySets提供的.query方法获得的基础SQL查询。此方法返回字符串文字。

假设您有QuerySet的元组列表:

list_of_querysets = [(qSet1, qSet2, qSet3), (qSet3, qSet2), (qSet1, qSet3)]

要检查新的任意元组qsets_arb = (qSet_arb1, qSet_arb2)是否已在列表中匹配,您可以执行以下操作:

def get_sql(tuple_of_querysets):
    '''Return a set of SQL statements from a tuple of QuerySets'''
    return set([str(queryset.query) for queryset in tuple_of_querysets])

# ordering of items in sets do not matter: set([q1, q2]) = set([q2, q1])
if get_sql(qsets_arb) in map(get_sql, list_of_querysets[:]):
     print("This tuple of QuerySets has already been included")
else:
     list_of_querysets.append(qsets_arb)

那几乎应该做你想要的。