2013-09-07 4 views
4

У меня не было очень тщательного обучения на питоне, а иногда и не знаю, как правильно это делать . Одна из этих вещей - это тестирование, если результат resultQuery возвратил результат или нет. Я считаю, что делает это много:Python django, как правильно проверить, вернул ли результат запроса

try: 
     user = User.objects.get(email=email) 
    except DoesNotExist: 
     user = User() 

Я не знаю, о питоне, но попробуйте уловы на других языках должны быть исключением, а не для нормального выполнения программы. Как бы вы сделали это с помощью if else? Я предполагаю, что я хочу что-то подобное:

if request.GET.get('email','') is not None: 
    email = request.GET['email']) 
+0

Я видел оригинальную модель в других ORM, кроме Django, я бы не потел ее. Обращение с исключительной ситуацией не обязательно должно быть «залогом и сообщать об ошибке». В противном случае вы можете сделать 'if len (User.objects.filter (email = email)) == 1: ...'. – millimoose

+2

Также: https://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create – millimoose

+1

Для этого конкретного случая я бы пошел с 'get_or_create', так как короче, но, вообще говоря, Ответ jro - это путь. – asermax

ответ

4

Ваш пример исключением является наиболее часто предпочтительный способ делать вещи. Wikipedia имеет довольно хорошее описание об этом:

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

Исключения часто используются в качестве альтернативы if-блоку (...). Общепризнанным девизом является EAFP, или «Легче спросить за прощение, чем разрешение».

Исключения не обязательно являются дорогостоящими в Python. Опять же, со ссылкой на пример Википедии:

if hasattr(spam, 'eggs'): 
    ham = spam.eggs 
else: 
    handle_error() 

... против:

try: 
    ham = spam.eggs 
except AttributeError: 
    handle_error() 

Эти два образца кода имеют тот же эффект, хотя и будет разница в производительности. Когда спам имеет яйца атрибутов, образец EAFP будет работать быстрее. Когда у спама нет яиц атрибута («исключительный» случай), образец EAFP будет работать медленнее.

В частности, для Django я бы использовал пример исключения. Это стандартный способ сделать что-то в этой области, а следующие стандарты никогда не будут плохими :).

0

Вы можете использовать .filter() вместо .get(), а также использовать оптимизированную оценку QuerySet Джанго.

Вы можете сделать

qs = User.objects.filter(email=email) 
if qs : 
    user = qs[0] 
... 
+0

Я хотел бы добавить, что возврат get и filter - это экземпляры разных классов, важные, когда дело касается выбора связанных ссылок или экспорта значений ... –

0

Django определяет класс EmptyQuerySet, который может использоваться для специальных реализаций при строгом тестировании isinstance(...).

прямой способ заключается в следующем:

try: 
    user = User.objects.get(email=email) 
    if user: 
     # ... 
    else: 
     # ... 

except DoesNotExist: 
    user = User() 

Джанго обеспечивает способ get непосредственно получить один единственный экземпляр модели или вызовет исключение.В этом случае обычным способом является проверка Исключения, например DoesNotExist

Чтобы получить целые строки из запроса базы данных, как обычно, используйте метод user.objects.filter(...). Возвращенный экземпляр QuerySet предоставляет вам методы .count(), .exists().

+0

Обратите внимание, что методы 'count' и' exist' делают вызов базы данных, поэтому, если у вас уже есть результаты запроса в памяти, 'len' быстрее, чем' count'. –

0

Я согласен с тем, что для исключения является нормальный шаблон здесь. Если вам нужно проверить, возвращает ли запрос запрос, метод exists - это один из способов сделать так, чтобы я не думал, что он уже упоминался. Документы сталкиваются с различными последствиями производительности, особенно в том случае, если вы знаете, что запрос будет оцениваться, лучше просто проверить булевскую интерпретацию набора запросов.

Смежные вопросы