Менеджер моделей 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
    )     

Теперь данные из базы данных будут извлекаться каждый раз при инициализации формы, а не только один раз при запуске.

Вернуться на верх