Найти - Пользователи
Полная версия: try: IndexError или exists. Что лучше при проверке объекта в БД
Начало » Django » try: IndexError или exists. Что лучше при проверке объекта в БД
1
ilnur
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 = ''
что выбрать?
FishHook
А почему не
try:
    obj = Models.objects.get(id=1)
except KakoyTamError:
    obj = ''
ilnur
тогда так.
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 = ''

что лучше? Или ктобы что выбрал?
FishHook
Еще вариант написать менеджер, который будет возвращать объект по 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)
ilnur
да. Придумать можно много наверное.

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

Я стараюсь выбирать читаемость, а так по большому счету вообще без разницы , какой вариант выберешь…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB