在Django中有没有一种方法可以在一个数据库命中(Debug Toolbar显示2个查询)中实现以下功能?
q = SomeModel.objects.filter(name=name).order_by(some_field)
if q.count() == 0:
q = SomeModel.objects.all().order_by(some_field)
我想检查是否存在具有给定名称的对象。如果是,则返回它们。如果不是,则返回所有对象。所有操作都在一个查询中完成。
我检查了子查询,Q,条件表达式,但仍然看不到如何将其放入一个查询中。
发布于 2019-05-10 04:42:07
好吧,尽管我拒绝了(我仍然认为这是过早的优化),好奇心控制了我。这并不美观,但确实很有用:
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)
我试过了,肯定只有一个查询。有趣的是,对于大型数据集,它是否真的要快得多。
发布于 2019-05-10 03:10:55
最好的办法是使用.exists()
,否则您的代码就没问题
q = SomeModel.objects.filter(name=name).order_by(some_field)
if not q.exists():
q = SomeModel.objects.all().order_by(some_field)
https://stackoverflow.com/questions/56066033
复制相似问题