如何检查一个元素是不是存在于 Django 查询集中?

Posted

技术标签:

【中文标题】如何检查一个元素是不是存在于 Django 查询集中?【英文标题】: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?

【问题讨论】:

【参考方案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(): ... 在这里做点什么'

以上是关于如何检查一个元素是不是存在于 Django 查询集中?的主要内容,如果未能解决你的问题,请参考以下文章

django怎么判断数据库的记录是不是存在

Hive:如何检查一个数组的值是不是存在于另一个数组中?

在Django中通过反向存在检查过滤查询集

如何检查数组的元素是不是存在于字符串中

Jinja2 - 检查一个查询集元素是不是在另一个

在 Presto 中,如何检查我通过子查询获取的列表中是不是存在数组中的元素