【问题标题】:How to check if an element is present in a Django queryset?如何检查一个元素是否存在于 Django 查询集中?
【发布时间】:2015-11-07 05:54:24
【问题描述】:

它像普通的 python 集吗?

假设我有以下查询集

entry_set = Entry.objects.all()

如何检查entry_set中是否存在Entry Object e?

【问题讨论】:

    标签: python django python-2.7 python-3.x django-models


    【解决方案1】:

    您可以使用以下代码:

    if e in Entry.objects.all():
            #do something
    

    或者最好的方法:

    if Entry.objects.filter(id=e.id).exists():
            #do something
    

    【讨论】:

    • 如果我有一个条目标题而不是条目对象并想检查该标题是否存在于查询集中怎么办?
    • @Brian,你可以做类似Entry.objects.filter(title='Your awesome title').exists()
    【解决方案2】:

    根据 Django 文档,最好的方法是:https://docs.djangoproject.com/en/2.1/ref/models/querysets/#exists

    if Entry.objects.filter(id=item.id).exists():
        # Do something
    

    但你也可以这样做:

    if item in Entry.objects.all():
        # Do something
    

    尽管这种方法尽可能地更糟糕。因为它会遍历整个 Queryset 一个一个地从数据库中提取元素,而另一种方法几乎所有事情都在数据库级别完成。

    如果您有 id 列表或 Queryset 其他方法将使用 __in

    查询集示例:

    query_ids = other_queryset.values_list('field_id', flat=True)
    if Entry.objects.filter(id__in=query_ids).exists():
        # Do something
    

    或者如果你有一个 id 列表:

    if Entry.objects.filter(id__in=[1, 2, 3, 4, 5]).exists():
        # Do something
    

    请记住,每次您执行len(queryset)item in querysetlist(queryset) 时,都会严重影响 Django 的性能。我已经看到一些案例,通过避免这种做法,我们在应用程序中改进了几十秒。

    【讨论】:

    • Entry.objects.filter(id__in=[1, 2, 3, 4, 5]).exists() 将返回 True 如果列表中至少有一个元素在查询集中
    【解决方案3】:

    您可以使用in 运算符:

    entry_set = Entry.objects.all()
    if an_entry in entry_set:
        # The element present.
    

    【讨论】:

      【解决方案4】:

      您可以根据 Entry 模型中存在的唯一键过滤查询集。比如说,那个键是 id,你的代码会变成:

      is_present = Entry.objects.filter(id=e.id)
      if is_present:
          print "Present"
      else:
          print "Not Present"
      

      【讨论】:

      • 使用 .exists() 如果您无法过滤掉唯一键,将阻止您引入额外的值。也可以直接在if语句中使用,省去变量的使用。例如'if Entry.objects.filter(id=e.id).exists(): ... 在这里做点什么'
      猜你喜欢
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 2012-12-12
      相关资源
      最近更新 更多