Конвенция для проверки существования модели Джанго? - PullRequest
2 голосов
/ 06 февраля 2010

Каков приемлемый способ проверки существования модели в приложении Django?

Я видел этот метод:

def profile_exists(user):
        try:
                UserProfile.objects.get(user = user)
                return True
        except:
                return False

Есть ли встроенная функция, подходящая для этой цели?

Ответы [ 4 ]

2 голосов
/ 06 февраля 2010

В качестве дополнительного примечания вы можете сделать из него функцию общего назначения:

def object_exists(model, **kwargs):
       try:
             model.objects.get(**kwargs)
             return True
       except model.DoesNotExist:
             return False

А потом просто позвоните:

profile_exists = object_exists(UserProfile, user=user)
2 голосов
/ 06 февраля 2010

Голые except с не должны использоваться. Вместо этого DoesNotExist внутреннее исключение модели или django.core.exceptions.ObjectDoesNotExist должно быть перехвачено .

Кроме того, допустимо либо это, либо использование len(SomeModel.objects.filter(...)).

1 голос
/ 06 февраля 2010

Это подходит, пока не раздеться except. С ними вы всегда получаете больше, чем рассчитываете!

Как отметил Игнасио Васкес-Абрамс , следует использовать встроенное исключение DoesNotExist для модели:

def profile_exists(user):
        try:
                UserProfile.objects.get(user = user)
                return True
        except UserProfile.DoesNotExist:
                return False

Presto!

0 голосов
/ 06 февраля 2010

Всегда есть get_object_or_404, что, как следует из названия, либо возвращает объект, либо вызывает ошибку HttpNotFound:

from django.shortcuts import get_object_or_404
instance = get_object_or_404(SomeModel, filter_args=whatever)
...