В django не рекомендуется извлекать записи базы данных с полями slug, загруженными приборами?

Я работаю над базой кода, в которой первоначальный разработчик создал ProductType model с несколькими строками в базе данных, представляющими несколько типов продуктов. По всему коду есть такие операторы, как ProductType.objects.get(slug='foo_product_type'). Эти операторы вызовут полный сбой, если приборы не загрузили запись ProductType с slug = 'foo_product_type'. Как лучше всего определить ProductType с помощью слага 'foo_product_type'? Кажется, что код Python не должен зависеть от загружаемых приборов, но я действительно не могу придумать другого решения. Это похоже на плохую практику, когда логика вашего сервера зависит от определенных полей базы данных, но я не уверен, что смогу придумать другой метод.

Я работал с использованием choices= в определении модели, но, похоже, это больше для целостности данных, а не для загрузки записи с такими деталями, как price, так что это мне не помогает. В настоящее время я загружаю фикстуры после переноса новой базы данных, и это работает, но мне любопытно, есть ли у кого-нибудь лучшее решение.

if ProductType.objects.get(slug='foo_product_type'):

когда ProductType с слагом 'foo_product_type' не существует.

Когда прибор загружается, объект захватывается для использования в коде. Когда запись отсутствует, приложение вылетает.


person rmbIV    schedule 26.08.2019    source источник
comment
Вышеупомянутое не будет работать, так как .get(..) вызывает ошибку, если запись не существует.   -  person Willem Van Onsem    schedule 26.08.2019
comment
@WillemVanOnsem да, это правильно. Я ищу другой подход. Подойдет ли django-enum?   -  person rmbIV    schedule 26.08.2019


Ответы (1)


Вы должны использовать try-except:

try:
   product_type = ProductType.objects.get(slug='foo_product_type')
   ...
except ProductType.DoesNotExist:
   # handle exception here
person Artem Kolontay    schedule 26.08.2019
comment
Спасибо за предложение. Наряду с этим есть также get_or_create() docs .djangoproject.com/en/2.2/ref/models/querysets/. Однако я больше ищу более общее решение. - person rmbIV; 26.08.2019