У меня есть собственный набор запросов в менеджере моделей:
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 (), не подходит для использования в качестве базового менеджера.