#django #django-models
Вопрос:
Когда я пытаюсь сбросить базу данных (я создал новую пустую базу данных)
я получил эту ошибку, когда я запускаю эту команду python manage.py
для миграции (или миграции)
for pattern in self.url_patterns:
File "djangoutilsfunctional.py", line 48, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "djangourlsresolvers.py", line 589, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "djangoutilsfunctional.py", line 48, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "djangourlsresolvers.py", line 582, in urlconf_module
return import_module(self.urlconf_name)
File pythonpython39libimportlib__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 790, in exec_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "projecturls.py", line 18, in <module>
path('api/v2/', include('project.api.urls'), name='api'),
File "djangourlsconf.py", line 34, in include
urlconf_module = import_module(urlconf_module)
File "pythonpython39libimportlib__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 790, in exec_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "projectapiurls.py", line 3, in <module>
from .views import *
File "projectapiviews.py", line 146, in <module>
class SampleViewSet(viewsets.ModelViewSet):
File "projectapiviews.py", line 148, in SampleViewSet
general = General.objects.get(is_active=True)
File "djangodbmodelsmanager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "djangodbmodelsquery.py", line 425, in get
num = len(clone)
File "djangodbmodelsquery.py", line 269, in __len__
self._fetch_all()
File "djangodbmodelsquery.py", line 1308, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "djangodbmodelsquery.py", line 53, in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
File "djangodbmodelssqlcompiler.py", line 1156, in execute_sql
cursor.execute(sql, params)
File "djangodbbackendsutils.py", line 98, in execute
return super().execute(sql, params)
File "djangodbbackendsutils.py", line 66, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "djangodbbackendsutils.py", line 75, in _execute_with_wrappers
return executor(sql, params, many, context)
File "djangodbbackendsutils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "envlibsite-packagesdjangodbutils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "envlibsite-packagesdjangodbbackendsutils.py", line 84, in _execute
return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: HATA: "app_general" object doesnt exist
LINE 1: ...", "app_general"."field1" FROM "field_2...
views.py
class SampleViewSet(viewsets.ModelViewSet):
general = General.objects.get(is_active=True)
queryset = model.objects.filter(field=site_general.field)
я удалил все файлы миграции во всех приложениях (без __init__
), а также файлы .pyc
есть ли какая-нибудь идея для этой проблемы?
(отредактируйте, я добавил обратную трассировку)
Комментарии:
1. @AbdulAzizBarkat я отредактировал
2. @АбдулАзизБаркат
class SampleViewSet(viewsets.ModelViewSet): general = General.objects.get(is_active=True) queryset = model.objects.filter(field=site_general.field)
3. @AbdulAzizBarkat я добавил
4. Что там
site_general
внутриmodel.objects.filter(field=site_general.field)
?5. @АбдулАзизБаркат я не думаю views.py это вызовет проблемы, потому что я много раз менял базу данных, но теперь возникла проблема, и я не менял views.py и этот вид.
Ответ №1:
Все атрибуты класса, не относящиеся к методу, оцениваются /выполняются во время объявления или определения класса. Следовательно, когда интерпретатор достигает вашего класса SampleViewSet
, он пытается выполнить строку general = General.objects.get(is_active=True)
, но, конечно, ваша база данных еще не существует, и поскольку вызов .get
подразумевает запрос к базе данных, вы получаете ошибку.
В общем случае любая инструкция, которая может вызвать запрос к базе данных, должна выполняться либо методом конфигурации приложения ready
, либо каким-либо промежуточным программным обеспечением / контекстным процессором, либо представлением в запросе. Глядя на код, он не выглядит так, как будто вы general
его где-либо используете, поэтому вы можете просто удалить его:
class SampleViewSet(viewsets.ModelViewSet):
queryset = model.objects.filter(field=site_general.field)
Вы могли model.objects.filter(...)
бы сказать, что это также вызовет запрос, но .filter
возвращаемые значения a QuerySet
и queryset являются ленивыми и, следовательно, оцениваются только при необходимости, так что это не вызовет никаких ошибок.
Комментарии:
1. Я получил это в строке комментариев, и это сработало, но это был странный опыт. Спасибо за помощь