【问题标题】:Make sure all list items based on fields exists in table efficiently确保所有基于字段的列表项有效地存在于表中
【发布时间】:2021-08-12 15:21:59
【问题描述】:

我有一个这样的模型:

class MyModel(models.Mode):
    foo = models.CharField(...)
    bar = models.CharField(...)

我有一个包含 foo 和 bar 字段值的列表。我想检查此列表中的所有项目,是否存在于数据库中。 例如:

my_list = [{'foo': 'foo_1','bar': 'bar_1'}, {'foo': 'foo_2','bar': 'bar_2'}]

我想检查数据库中列表项字段对应的所有记录是否存在值。我可以更改我的列表结构。

我可以使用 for 循环来做到这一点,但我想找到更有效的方法。单个查询可以吗?有什么建议吗?

【问题讨论】:

    标签: python python-3.x django postgresql django-queryset


    【解决方案1】:

    您可以尝试从 SQL 响应中检查实例数:

    from django.db.models import Q
    
    my_list = [{'foo': 'foo_1','bar': 'bar_1'}, {'foo': 'foo_2','bar': 'bar_2'}]
    query = Q()
    for i in my_list:
        query &= Q(foo=i['foo'], bar=i['bar'])
    queryset = MyModel.objects.filter(query)
    
    assert queryset.count() == len(my_list)  # 2 == 2
    

    因此,如果您的数据库中有所有值,则 count 和 len 值将相同。

    如果您的 my_list 仅包含正确的字段,您可以这样做:

    for i in my_list:
        query &= Q(**i)
    

    【讨论】:

    • 请注意,这种方法的工作前提是foobar 一起是唯一的(如果存在多个具有相同foobar 的条目将失败)
    • 如果存在多个具有foobar 的值,它不会下降,因为我们使用filter
    • 很好,但这并没有达到我的预期。我想知道`&=`是否必须是|=
    • 如果存在多个具有相同foobar 的条目,那么您将得到的计数将是错误,这就是我所说的。
    • @kamilyrb 它基于您所需要的ANDOR
    猜你喜欢
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2020-10-30
    • 2019-07-10
    • 2020-03-24
    • 1970-01-01
    • 2021-08-08
    • 2012-07-28
    相关资源
    最近更新 更多