Ошибка валидации поля ModelChoiceField в Django при использовании пользовательского менеджера запросов
При попытке отправить форму с использованием ModelChoiceField с набором запросов с помощью пользовательского менеджера я получаю ошибку валидации. Стандартный менеджер объектов также заменен на пользовательский менеджер, который отфильтровывает архивные объекты. Это хорошо работает на всем сайте
Моя модель (очень упрощенная):
# Use this as the default manager - filters out any records with an archivetype
class ActiveManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(archive__isnull=True)
# Alternative manager that returns non archived records and records archived with 'SYS' only
class SysManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(models.Q(archive__isnull=True) | models.Q(archive='SYS'))
class Inventory(models.Model):
item = models.CharField(primary_key=True)
description = models.CharField()
archive = models.CharField(null=True, blank=True)
objects = ActiveManager()
objects_sys = SysManager()
objects_all = models.Manager() # Default manager now objects_all
class Building(models.Model):
item = models.ForeignKey(Inventory, on_delete=models.PROTECT)
У меня есть форма Building, которая использует поле Item и настраивает атрибуты виджета (мне нужны дополнительные атрибуты в HTML):
class BuildingForm(forms.ModelForm):
item = forms.ModelChoiceField(queryset=Inventory.objects_sys.all(),
widget = forms.TextInput(attrs={
'class': 'important',
'code': '1x1'}))
Inventory.objects_sys.all() возвращает набор запросов, который включает запись инвентаризации с элементом под названием 'INSPECT', а Inventory.objects.all() - нет. Это ожидаемое и желаемое поведение в моем случае.
В созданном выпадающем списке отображаются дополнительные записи, возвращенные пользовательским менеджером (одна из них - 'INSPECT'), но если я выбираю 'INSPECT' и отправляю, то получаю ошибку проверки "Inventory instance with item 'INSPECT' does not exist." Запись инвентаризации с именем элемента 'INSPECT' и архивным полем='SYS' существует в базе данных. Когда я выбираю любой другой элемент с архивом NULL, форма отправляется нормально. Похоже, что он правильно использует менеджер 'objects_sys' для получения всех опций для заполнения Select, но при этом использует менеджер 'objects' для проверки того, что отправленное значение действительно и находится в таблице Inventory ('INSPECT' не будет возвращено с помощью 'objects'). Есть ли еще какое-то место, где я должен указать запрос для проверки и использовать менеджер 'objects_sys'?
Спасибо за любое понимание.