首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >过滤对象或(如果找到0)通过一次DB命中获取Django中的所有对象

过滤对象或(如果找到0)通过一次DB命中获取Django中的所有对象
EN

Stack Overflow用户
提问于 2019-05-10 03:03:51
回答 2查看 44关注 0票数 1

在Django中有没有一种方法可以在一个数据库命中(Debug Toolbar显示2个查询)中实现以下功能?

代码语言:javascript
复制
q = SomeModel.objects.filter(name=name).order_by(some_field)
if q.count() == 0:
    q = SomeModel.objects.all().order_by(some_field)

我想检查是否存在具有给定名称的对象。如果是,则返回它们。如果不是,则返回所有对象。所有操作都在一个查询中完成。

我检查了子查询,Q,条件表达式,但仍然看不到如何将其放入一个查询中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-10 04:42:07

好吧,尽管我拒绝了(我仍然认为这是过早的优化),好奇心控制了我。这并不美观,但确实很有用:

代码语言:javascript
复制
from django.db.models import Q, Exists

name_qset = SomeObject.objects.filter(name=name)
q_func = Q(name_exists=True, name=name) | Q(name_exists=False)
q = SomeModel.objects.annotate(
    name_exists=Exists(name_qset)
).filter(q_func).order_by(some_field)

我试过了,肯定只有一个查询。有趣的是,对于大型数据集,它是否真的要快得多。

票数 1
EN

Stack Overflow用户

发布于 2019-05-10 03:10:55

最好的办法是使用.exists(),否则您的代码就没问题

代码语言:javascript
复制
q = SomeModel.objects.filter(name=name).order_by(some_field)
if not q.exists():
    q = SomeModel.objects.all().order_by(some_field)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56066033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档