有没有办法构造一个 Q 对象,它代表一个 EmptyQueryset,即总是返回一个空结果?

Posted

技术标签:

【中文标题】有没有办法构造一个 Q 对象,它代表一个 EmptyQueryset,即总是返回一个空结果?【英文标题】:Is there way to construct a Q object, that represents a EmptyQueryset, i.e. that always returns an empty result? 【发布时间】:2011-07-17 13:16:38 【问题描述】:

在 django 中,我想根据其他一些对象的属性从数据库中检索对象。如果其他对象之一不存在,则不应影响查询结果。代码是这样的:

from django.db.models import Q
try:
    objectA = MyModel.objects.get(id = idA)
    qA = Q(foo = objectA.bar)
except MyModel.DoesNot.Exist:
    qA = Q(???)
try:
    objectB = MyModel.objects.get(id = idB)
    qB = Q(abc = objectB.xyz)
except MyModel.DoesNot.Exist:
    qB = Q(???)
result = MyOtherModel.objects.filter(qA | qB, **other_filter_conditions)

对于查询集,有 none() 方法,它总是返回 EmptyQueryset。 Q 对象有类似的东西吗?

或者有没有更好的方法来解决我的问题?

【问题讨论】:

MyModelMyOtherModel是什么关系。这不只是mymodel__foo = idAmymodel__abc = idB 之类的查询吗? @S.Lott:不,Q 对象比示例中的要复杂得多。 这并不能真正回答问题。 MyModelMyOtherModel 是什么关系。虽然过滤器可能很复杂,但也可以使用docs.djangoproject.com/en/1.2/topics/db/queries/… 技术稍微简化一下。 @S.Lott:承认,你是对的。逻辑是这样的:一个约会是取消。现在我想要所有可以/应该重新安排并满足这些条件的未来约会:(在取消之前有一个约会and约会类别兼容and未来的约会适合) or (那里是下一个约会and 类别兼容and 要移动的约会适合差距*完全*)。我不知道如何在通常的查询中表达这一点,而 Ignacios 解决方案完美运行。有什么问题吗? 请用更完整的数据模型更新问题。 【参考方案1】:

对于查询集,有 none() 方法,它总是返回 EmptyQueryset。 Q 对象有类似的东西吗?

Q(pk=-1)

【讨论】:

【参考方案2】:
qList = []
try:
  objectA = ...
  qList.append(Q(foo=objectA.bar))
except ...:
  ...
 ...

result = MyOtherMdel.objects.filter(reduce(operator.or_, qList),
  **other_filter_conditions)

【讨论】:

谢谢。按预期工作。

以上是关于有没有办法构造一个 Q 对象,它代表一个 EmptyQueryset,即总是返回一个空结果?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法用一行在同一个对象上调用多个函数?

有没有办法在所有节点完成加载后使用 PyYAML 构造映射构造对象?

JAVA的问题g.drawImage第四个代表啥

有没有办法使用相同的布局动态创建片段并向它们显示数据?

在 Django 中构造 Q 对象时保持 SQL 运算符优先级

ObjectInputStream - 读取对象 - 有没有办法阻止调用无参数超类构造函数?