【问题标题】:Check if queryset already exists检查查询集是否已经存在
【发布时间】:2023-03-13 22:52:01
【问题描述】:

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

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

我该怎么做?

【问题讨论】:

  • 如果qSet1 是一个集合,那么看起来你有一个集合列表的元组。
  • @AlexHall 所有的 qSet 都是来自 django 过滤函数的查询集
  • 那么请更正您对问题的描述。

标签: python django duplicates


【解决方案1】:

要检查一组 QuerySet 的相同性(双关语),您可以使用从 Django 为 QuerySet 提供的 .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)

这几乎可以满足您的需求。

【讨论】:

    【解决方案2】:

    如果您要比较的是列表的内容,并且您不希望订单有所作为,您应该使用set

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

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

    【讨论】:

      猜你喜欢
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多