2013-12-08 3 views
0

Я пытаюсь получить объект, если он существует нормально, если нет, то что-то еще и так далее. Правильно ли делать следующее? Я слышал, что исключения дорогие, и shuold следует избегать, верно?Правильное использование исключений в python/django orm

try: 
    user = User.objects.get(user=id) 
except ObjectDoesNotExist: 
    try: 
     user = User.objects.get(email=id) 
    except ObjectDoesNotExist: 
     try: 
     # ... 

finally: 
    # do the final thing 

ответ

1

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

from django.contrib.auth.models import User 
from django.db.models import Q 
user = User.objects.filter(Q(user=id) | Q(email=id) | [...])[0] 

Это зависит от Джанго Q-objects, которые позволяют создавать условия объединены в более сложными способами, чем обычные и объединений, которые вы обычно получаете при создании фильтров. Если вас не волнует возможность возврата нескольких объектов, вы все равно можете использовать метод get(), как в своем примере.

+0

Я новичок, и я не знал об этом, большое спасибо за вашу помощь и время. – neelix

1

Стоимость попытки/за исключением объясняется здесь: cost-of-exception-handlers-in-python

Я предлагаю, чтобы поймать то, что не должно произойти, или только случаются редко (реальные исключения) с Try/за исключением и более общих ситуаций, с условиями. Особенно в случае, например, как Model.objects.get(), где базовый sql возвращает пустой список, который не вызвал бы исключение, если он был вызван как фильтр.

users = User.objects.filter(user=id)[:1] 
user = users and users[0] 
+0

Спасибо большое во второй раз сегодня, это было очень полезно, несмотря на то, что я использовал другой. – neelix

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