Почему набор запросов, применяемый в ModelForm, не наследует набор запросов от ModelManager? - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть собственный набор запросов в менеджере моделей:

class TenantManager(models.Manager):
    def get_queryset(self):
       return super().get_queryset().filter(myfield=myvalue)

class TenantModel(TenantModelMixin, models.Model):
    objects = TenantManager()

    class Meta:
        abstract = True

Я использую абстрактный TenantModel в качестве смеси с другой моделью для применения TenantManager. Например,

class MyModel(TenantModel):

Это работает, как и ожидалось, применяя фильтр TenantManager каждый раз, когда MyModel.objects.all() вызывается, когда внутри представления.

Однако, когда я создаю ModelForm с модели, фильтр не применяется, и возвращаются все результаты (без фильтра. Например:

class AddPersonForm(forms.ModelForm):

    person = forms.ModelMultipleChoiceField(
        queryset=MyModel.objects.all(),
    )

    class Meta:
        model = MyOtherModel
        fields = ('person', )

Почему это так и как убедиться, что ModelManager применен к набору запросов в ModelForm ?

Редактировать

Возможно, причина в том, что формы используют ._base_manager, а не .objects, однако документы скажем, не фильтровать этот тип менеджера, так как один фильтр формирует запросы?

Не отфильтровывать результаты в подклассе этого типа менеджера

Этот менеджер используется для доступа к объектам, связанным с какой-либо другой моделью. В этих ситуациях Django должен иметь возможность видеть все объекты для модели, которую он выбирает, чтобы можно было извлечь все, на что ссылаются.

Если вы переопределите метод get_queryset () и отфильтруете все строки, * 1 041 * вернет неверные результаты. Не делай этого. Менеджер, который фильтрует результаты в get_queryset (), не подходит для использования в качестве базового менеджера.

...