Есть ли обходной путь для ошибки Django `ModelDoesNotExist` в подобной ситуации?
При выполнении ModelDoesNotExist
я получаю ошибку manage.py runserver
, потому что в файле в моем каталоге я делаю запрос к таблице, которая еще не заполнена.
def __init__(self):
self.spotify_object = SocialToken.objects.get(account__provider="spotify")
Выше представлен класс, созданный для выполнения своего рода аутентификации, и таблица SocialToken
заполняется только после того, как я войду в систему. Теперь мне интересно, есть ли способ избежать ошибки, запустив эту часть кода только после входа в систему? Я использую класс только в конечной точке, и за это время таблица была бы заполнена, но тот факт, что она не заполняется перед запуском сервера, вызывает ошибку DoesNotExist
. Есть ли решение этой проблемы?
Traceback
File "C:\Users\Kwaku Biney\Desktop\sparison-1\project\Sparison\views.py", line 4, in <module>
from .authentication import SparisonCacheHandler
File "C:\Users\Kwaku Biney\Desktop\sparison-1\project\Sparison\authentication.py", line 43, in
<module>
cache_handler = SparisonCacheHandler() ,
File "C:\Users\Kwaku Biney\Desktop\sparison-1\project\Sparison\authentication.py", line 25,
in __init__
self.spotify_object = SocialToken.objects.get(account__provider="spotify")
File "C:\Users\Kwaku Biney\Desktop\sparison-1\project\venv\lib\site-
packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\Kwaku Biney\Desktop\sparison-1\project\venv\lib\site-
packages\django\db\models\query.py", line 429, in get
raise self.model.DoesNotExist(
allauth.socialaccount.models.DoesNotExist: SocialToken matching query does not exist.
В моем views.py
я импортирую класс, который содержит запрос, и появляется ошибка.
Есть два способа избежать ошибки DoesNotExist
.
A) Используйте .filter()
вместо .get()
.
Фильтрация приводит к пустому набору запросов, когда поиск оказывается пустым.
def __init__(self):
self.spotify_object = SocialToken.objects.filter(account__provider="spotify")
B) Используйте get_object_or_404()
вместо .get()
.
Это встроенная функция django:
Calls get() on a given model manager, but it raises Http404 instead of the model’s DoesNotExist exception.
def __init__(self):
self.spotify_object = SocialToken.objects.get_object_or_404(account__provider="spotify")
Надеюсь, я смог вам помочь. Хорошего дня.