Джанго: тестирование получить запрос - PullRequest
0 голосов
/ 26 марта 2010

Хорошо, мне надоело писать это ...

res = Something.objects.filter(asdf=something)

if res:
  single = res[0]
else:
  single = None

if single:
  # do some stuff

Я бы предпочел сделать что-то вроде этого:

single = Something.objects.filter(asdf=something)
if single:
  #do some stuff

Я хочу иметь возможность получить один объект без проверки отфильтрованных результатов.

Другими словами, когда я знаю, что будет 1 или 0 подходящих записей, я хотел бы перейти прямо к этой записи, в противном случае просто получить «Нет». Ошибка DoesNotExist, сопровождающая .get, не всегда работает так хорошо при попытке сжать эти запросы в одну строку.

Есть ли способ сделать то, что я описал?

Ответы [ 2 ]

3 голосов
/ 26 марта 2010

Проект django-раздражает включает в себя ярлык get_object_or_None, который делает это, хотя написать его самостоятельно - тривиально.

2 голосов
/ 26 марта 2010

Создайте пользовательский Manager, который инкапсулирует бит, который вам надоело повторять в качестве метода (с лучшим именем, чем у приведенного ниже), или просто напишите вспомогательную функцию, которая делает то же самое без попадание в определения модели:

class MyManager(models.Manager):
    def get_or_none(self, **kwargs):
        try:
            return self.get(**kwargs)
        except self.model.DoesNotExist:
            return None

class MyModel(models.Model):
    objects = MyManager()

Использование:

MyModel.objects.get_or_none(asdf=something)
...