как убедиться, что набор запросов будет упорядочен по допустимому полю - django - PullRequest
3 голосов
/ 05 марта 2010

Это часть кода тега шаблона, где qs - это набор запросов.

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

Как я могу проверить, будет ли набор запросов упорядочен по допустимому полю, прежде чем выполнение кода выйдет за рамки тега шаблона, кроме форсирования оценки?

Код как есть, не вызывает ошибку, так как набор запросов не оценивается. qs.exists() также не является ответом, поскольку он выполнит запрос без заказа.

РЕДАКТИРОВАТЬ : Обратите внимание, что запрос может быть более сложным, чем мой простой пример до редактирования Foo.objects.all(), например, он может содержать метод extra(), который приводит к объединениям.

Ответы [ 4 ]

3 голосов
/ 31 января 2012

Вы можете принудительно проверить набор запросов, запустив str (qs.query). В этот момент вы можете перехватить исключение, не вызывая его запроса к базе данных.

try:
    str(qs.order_by('some_field').query)
except FieldError:
    # bad order_by
    pass
2 голосов
/ 05 марта 2010

Если вы действительно против перехвата исключения (которым вы не должны быть), вы можете сделать это:

if context['key'] in [field.name for field in Foo._meta.fields]:
    qs = Foo.objects.all().order_by(context['key'])
1 голос
/ 05 марта 2010

Я не уверен, что это хорошая идея, поскольку здесь могут быть соображения безопасности. Я думаю, что это сработает, но у меня нет копии Джанго, чтобы проверить это точно. Я почти уверен, что когда вы делаете это, выдается исключение, но если вы не хотите его перехватывать или проверять, это должно сработать:

if hasattr(Foo, "fieldname") and isinstance(getattr(Foo, "fieldname"), models.Field):
    print "Safe field"
else:
    print "Invalid field"
1 голос
/ 05 марта 2010

Использование order_by() с несуществующим полем приведет к django.core.exceptions.FieldError. Просто поймайте это и сообщите об ошибке пользователю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...