这是模板标记代码的一部分,其中qs是查询集。

def foo(qs):
    ...
    context['key'] = qs.order_by('an_invalid_field_coming_from_user')


除了强制评估之外,如何在代码执行超出模板标记的范围之前检查查询集是否将由有效字段排序?

由于未评估查询集,因此按原样的代码不会引发错误。 qs.exists()也不是答案,因为它将不经排序执行查询。

编辑:请注意,查询可能比我的预编辑简单示例Foo.objects.all()更复杂,例如,它可能具有导致连接的extra()方法。

最佳答案

您可以通过运行str(qs.query)强制查询集进行验证。此时,您可以捕获异常而不会导致其查询数据库。


try:
    str(qs.order_by('some_field').query)
except FieldError:
    # bad order_by
    pass

关于django - 如何确定queryset将由有效字段排序-Django,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2383218/

10-10 09:51