【发布时间】:2012-03-31 00:05:14
【问题描述】:
我有一个 Django QuerySet,我想从中得到一个 Q 对象。 (即包含与该查询集完全相同的查询。)
这可能吗?如果有,怎么做?
【问题讨论】:
标签: python django django-orm django-q
我有一个 Django QuerySet,我想从中得到一个 Q 对象。 (即包含与该查询集完全相同的查询。)
这可能吗?如果有,怎么做?
【问题讨论】:
标签: python django django-orm django-q
如果您想要 Q 对象,那么您也可以通过 ORing 另一个 Q 对象来重构复杂查询,如果两个 QuerySet 在同一模型上,您可以直接 OR QuerySet 以获得相同的效果。值得尝试并检查前后的 SQL。
例如:
qs1 = model.objects.filter(...)
print("qs1: {}".format(qs1.query)
qs2 = model.objects.filter(...)
print("qs2: {}".format(qs1.query)
qs = q1 | q2
print("qs: {}".format(qs.query)
我当然找到了你的问题,因为我正是出于这个原因想要查询中的 Q 对象,并在 Django 用户组中发现:
https://groups.google.com/d/msg/django-users/2BuFFMDL0VI/dIih2WRKAgAJ
QuerySet 的组合方式与 Q 对象的组合方式非常相似。
这可能对你有帮助,也可能对你没有帮助,这当然取决于你想要那个 Q 对象的原因。
【讨论】:
这不是您所要求的,但您可以通过访问查询成员从查询集中提取 sql。例如:
x = somequeryset.query
然后您可以在新的查询集对象上使用它来重建原始查询集。这可以更好地保存为查询集定义的“值”之类的内容。定义的 x 易于存储。我过去曾使用它来保存用户构建的查询/搜索,然后每天运行这些查询/搜索,并将结果通过电子邮件发送给用户。
【讨论】:
Q,因为你不能在上面使用&、|和~,但还是很高兴知道。
不,但您可以先创建 Q 对象,然后使用它;或者,将您的查询创建为 dict,并将其传递给您的过滤器方法和 Q 对象。
【讨论】: