Менеджер моделей Django queryset не обновляется до перезапуска сервера
У меня есть программа, которая позволяет пользователям загружать файлы данных и таблицы поиска (и те, и другие идентифицированы для определенной компании) и сопоставлять их вместе. Одна страница позволяет пользователям выбирать, для какой компании они хотят сопоставить данные, просматривая, какие компании имеют как файлы данных, так и таблицы поиска, для чего я использую менеджер наборов/моделей. Проблема в том, что если я загружаю новый файл данных и иерархию, кверисет не подхватывает их до перезапуска сервера. Queryset возвращает все компании, у которых есть файл данных и иерархии на момент запуска сервера, но не все, что было добавлено после этого. Я думаю, что это происходит потому, что queryset определяется при запуске, но я не уверен. Есть ли способ обойти это?
forms.py
class CompanySelectionForm(forms.Form):
companies = RawData.objects.get_companyNames(source="inRDandH")
companiesTuple = makeTuple(companies)
print(companiesTuple)
company = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-select'}), choices=companiesTuple)
managers.py
class RawDataManager(models.Manager):
def get_queryset(self):
return RawDataQuerySet(self.model, using=self._db)
def get_companyNames(self, source):
return self.get_queryset().get_companyNames(source)
class RawDataQuerySet(models.QuerySet):
def get_companyNames(self, source):
if (source == 'inRDandH'):
distinct_companiesRD = self.filter(fileType=0).values_list('companyName', flat=True).distinct()
distinct_companiesH = self.filter(fileType=1).values_list('companyName', flat=True).distinct()
distinct_companies = set(distinct_companiesRD).intersection(set(distinct_companiesH))
else:
distinct_companies = self.values_list('companyName', flat=True).distinct()
return distinct_companies
Проблема в том, что этот код выполняется только один раз, когда код инициализируется при запуске сервера, потому что он является частью определения класса вашей формы:
companies = RawData.objects.get_companyNames(source="inRDandH")
Решение состоит в том, чтобы сделать choices вызываемым , который запускается каждый раз при инстанцировании формы. определите это поле динамически, в методе формы:__init__
def get_companies_tuple():
companies = RawData.objects.get_companyNames(source="inRDandH")
return makeTuple(companies)
class CompanySelectionForm(forms.Form):
company = forms.ChoiceField(
widget=forms.Select(attrs={'class': 'form-select'}),
choices=get_companies_tuple
)
Теперь данные из базы данных будут извлекаться каждый раз при инициализации формы, а не только один раз при запуске.