Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » try: IndexError или exists. Что лучше при проверке объекта в БД [RSS Feed]

#1 Апрель 30, 2013 09:56:01

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

try: IndexError или exists. Что лучше при проверке объекта в БД

try:
    obj = Models.objects.filter(id=1)[0]
except IndexError:
    obj = ''

obj = Models.objects.filter(id=1)
if obj.exists():
    obj = obj[0]
else:
    obj = ''
что выбрать?

Офлайн

#2 Апрель 30, 2013 10:14:56

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

try: IndexError или exists. Что лучше при проверке объекта в БД

А почему не

try:
    obj = Models.objects.get(id=1)
except KakoyTamError:
    obj = ''



Офлайн

#3 Апрель 30, 2013 10:21:29

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

try: IndexError или exists. Что лучше при проверке объекта в БД

тогда так.

try:
    obj = Models.objects.get(id=1)
except KakoyTamError:
    obj = ''
try:
    obj = Models.objects.filter(id=1)[0]
except IndexError:
    obj = ''
obj = Models.objects.filter(id=1)
if obj.exists():
    obj = obj[0]
else:
    obj = ''

что лучше? Или ктобы что выбрал?

Отредактировано ilnur (Апрель 30, 2013 10:21:46)

Офлайн

#4 Апрель 30, 2013 12:41:47

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

try: IndexError или exists. Что лучше при проверке объекта в БД

Еще вариант написать менеджер, который будет возвращать объект по id или пустую строку


class SilentQuerySet(models.query.QuerySet):
    """
    Обычный QuerySet
    get возвращает None, если объект не найден, вызывает исключение MultipleRecordReturned если    найдено несколько
    get_one возвращает None если объект не найден или первый, если найдено несколько
    get_loud - вызывает исключение DoesNotExists если объект не найден, вызывает исключение MultipleRecordReturned если найдено несколько
    """
    def get(self, *args, **kwargs):
        try:
            return super(SilentQuerySet, self).get(*args, **kwargs)
        except self.model.DoesNotExist:
            return None
    def get_one(self, *args, **kwargs):
        clone = self.filter(*args, **kwargs)[:1]
        return clone.get()
    def get_loud(self, *args, **kwargs):
        return super(SilentQuerySet, self).get(*args, **kwargs)
class SilentManager(models.Manager):
    """
    Обычный Manager использующий SilentQuerySet вместо QuerySet
    """
    use_for_related_fields = True
    def get_query_set(self):
        return SilentQuerySet(self.model, using=self._db)
    def get_one(self, *args, **kwargs):
        return self.get_query_set().get_one(*args, **kwargs)
    def get_loud(self, *args, **kwargs):
        return self.get_query_set().get_loud(*args, **kwargs)



Офлайн

#5 Апрель 30, 2013 13:13:21

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

try: IndexError или exists. Что лучше при проверке объекта в БД

да. Придумать можно много наверное.

Но что из мной предложенныз в 3 посте. Лучше использовать? У кого какие +/-?

Офлайн

#6 Апрель 30, 2013 16:45:34

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

try: IndexError или exists. Что лучше при проверке объекта в БД

Однострочник

obj = next(Models.objects.filter(id=1)[:1].iterator(), '')
ilnur
Но что из мной предложенныз в 3 посте. Лучше использовать? У кого какие +/-?
А нужен первый объект или единственный? С единственным я бы get()/DoesNotExist использовал.

Отредактировано reclosedev (Апрель 30, 2013 16:46:11)

Офлайн

#7 Апрель 30, 2013 20:17:19

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

try: IndexError или exists. Что лучше при проверке объекта в БД

obj = Models.objects.filter(id=1)
obj = obj[0] if obj.exists() else ''

Я стараюсь выбирать читаемость, а так по большому счету вообще без разницы , какой вариант выберешь…

Офлайн

  • Начало
  • » Django
  • » try: IndexError или exists. Что лучше при проверке объекта в БД[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version