При выполнении миграции, приложение обращается к несуществующему столбцу
Прошу прощение за огромный кусок кода, но я и правда уже не знаю, что с этим делать. Я использую smart_selects
и его функционал GroupedForeignKey
. При выполнении команды makemigrations
мое приложение по какой-то причине обращается к столбцу таблицы БД, который я только-что добавил и ради которого делаю миграцию. Если я GroupedForeignKey
заменяю на models.ForeignKey
ошибка пропадает. Также ошибка пропадет, если я закомментирую эти строки в своем views.py:
from main.FilterSet import WorkFilter, GroupFilter
from main.forms import WorksForm, GroupForm, GroupForAdminAndAdministrationForm
В момент выполнения команды makemigrations
я получаю ошибку:
Traceback (most recent call last):
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedColumn: ОШИБКА: столбец Compressor_station.test не существует
LINE 1: ...."name_cs", "Compressor_station"."water_direction", "Compresso...
^
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\work\manage.py", line 22, in <module>
main()
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\work\manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\core\management\__init__.py", line 419, in execute_from_command_line
utility.execute()
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\core\management\__init__.py", line 413, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\core\management\base.py", line 354, in run_from_argv
self.execute(*args, **cmd_options)
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\core\management\base.py", line 393, in execute
self.check()
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\core\management\base.py", line 419, in check
all_issues = checks.run_checks(
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\core\checks\registry.py", line 76, in run_checks
new_errors = check(app_configs=app_configs, databases=databases)
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\core\checks\urls.py", line 13, in check_url_config
return check_resolver(resolver)
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\core\checks\urls.py", line 23, in check_resolver
return check_method()
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\urls\resolvers.py", line 416, in check
for pattern in self.url_patterns:
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\utils\functional.py", line 48, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\urls\resolvers.py", line 602, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\utils\functional.py", line 48, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\urls\resolvers.py", line 595, in urlconf_module
return import_module(self.urlconf_name)
File "C:\Users\den00\AppData\Local\Programs\Python\Python39\lib\importlib\__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 850, in exec_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\work\work\urls.py", line 11, in <module>
from main.views import views
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\work\main\views\views.py", line 24, in <module>
from main.forms import WorksForm, GroupForm, GroupForAdminAndAdministrationForm
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\work\main\forms.py", line 24, in <module>
class GroupForm(ModelForm):
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\forms\models.py", line 261, in __new__
fields = fields_for_model(
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\forms\models.py", line 183, in fields_for_model
formfield = f.formfield(**kwargs)
return self.cursor.execute(sql, params)
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\db\utils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "C:\Users\den00\PycharmProjects\DjangoProjects\work-server\venv\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: ОШИБКА: столбец Compressor_station.test не существует
LINE 1: ...."name_cs", "Compressor_station"."water_direction", "Compresso...
^
Models.py
class Filial(models.Model):
id_filial = models.AutoField(primary_key=True, verbose_name='id филиала')
name_filial = models.CharField(max_length=256, verbose_name='Наименование филиала')
class CompressorStation(models.Model):
id_cs = models.AutoField(primary_key=True,)
name_cs = models.CharField(max_length=256,')
water_direction = models.IntegerField(unique=True, blank=True, null=True)
test = models.IntegerField(blank=True, null=True)
id_filial = models.ForeignKey('Filial', models.DO_NOTHING, blank=True, null=True,
related_name='related_name_filial')
class Meta:
db_table = 'Compressor_station'
class PumpingUnit(models.Model):
id_gpu = models.AutoField(primary_key=True, verbose_name='id агрегата')
name_gpu = models.CharField(max_length=256,)
id_cs = models.ForeignKey('CompressorStation', models.DO_NOTHING, blank=True, null=True,
related_name='related_name_cs')
class Group(models.Model):
id_group = models.AutoField(primary_key=True,)
id_filial = models.ForeignKey('Filial', models.DO_NOTHING, related_name='filial')
id_cs = GroupedForeignKey(CompressorStation, "id_filial", on_delete=models.SET_NULL, blank=False, null=True, related_name='cs')
id_gpu = GroupedForeignKey(PumpingUnit, "id_cs", on_delete=models.SET_NULL, blank=False, null=True, related_name='gpu')
name_group = models.CharField(max_length=256)
Forms.py
class GroupForAdminAndAdministrationForm(ModelForm):
start_date = MyDateField(label='Укажите дату начала планируемых работ *', )
end_date = MyDateField(label='Укажите дату окончания планируемых работ *', )
class Meta:
model = Group
fields = [
'id_filial', 'id_cs',
'id_gpu',
'name_group', 'start_date', 'end_date', 'short_description']
widgets = {
"id_filial": Select(attrs={
'class': 'form-select',
}),
"id_cs": Select(attrs={
'class': 'form-select',
}),
"id_gpu": Select(attrs={
'class': 'form-select'
}),
"name_group": Textarea(attrs={
'class': 'form-control',
'placeholder': 'Укажите наименование группы работ',
'style': 'height: 70px'
}),
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.test = None
self.fields['id_cs'].queryset = CompressorStation.objects.none()
if 'id_filial' in self.data:
try:
id_filial = int(self.data.get('id_filial'))
self.fields['id_cs'].queryset = CompressorStation.objects.filter(id_filial=id_filial).order_by(
'name_cs')
except (ValueError, TypeError):
pass # invalid input from the client; ignore and fallback to empty gpu queryset
elif self.instance.id_cs:
self.fields['id_cs'].queryset = self.instance.id_filial.related_name_filial.all().order_by('name_cs')
self.fields['id_gpu'].queryset = PumpingUnit.objects.none()
if 'id_cs' in self.data:
try:
id_cs = int(self.data.get('id_cs'))
self.fields['id_gpu'].queryset = PumpingUnit.objects.filter(id_cs=id_cs).order_by('name_gpu')
except (ValueError, TypeError):
pass # invalid input from the client; ignore and fallback to empty gpu queryset
elif self.instance.id_gpu:
self.fields['id_gpu'].queryset = self.instance.id_cs.related_name_cs.all().order_by('name_gpu')
class WorksForm(ModelForm):
date_work = MyDateField(label='Укажите дату выполнения работы', )
class Meta:
model = Works
fields = ['name_work', 'date_work',]
widgets = {
"name_work": Textarea(attrs={
'class': 'form-control',
'placeholder': 'Укажите наименование работы',
'style': 'height: 70px'
}),
}
Filters.py
class GroupFilter(filters.FilterSet):
start_date = DateFromToRangeFilter(widget=RangeWidget(attrs={'type': 'date'}), label='Дата начала работ')
end_date = DateFromToRangeFilter(widget=RangeWidget(attrs={'type': 'date'}), label='Дата окончания работ')
search_name_group = filters.CharFilter(method='filter_search', label='Наименование группы работ')
def filter_search(self, queryset, name, value):
return queryset.annotate(search=SearchVector('name_group', )).filter(search=value)
class Meta:
model = Group
fields = ['id_filial', 'id_cs', 'id_gpu', 'search_name_group', 'start_date', 'end_date', ]
class WorkFilter(filters.FilterSet):
date_work = DateFromToRangeFilter(widget=RangeWidget(attrs={'type': 'date'}), label='Дата выполнения')
search_name_work = filters.CharFilter(method='filter_search', label='Наименование работы')
search_name_organization = filters.CharFilter(method='filter_search', label='Наименование организации')
def filter_search(self, queryset, name, value):
return queryset.annotate(search=SearchVector('name_work', 'name_organization')).filter(search=value)
class Meta:
model = Works
fields = ['search_name_work', 'search_name_organization', 'date_work']