Ошибка валидации поля 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'?

Спасибо за любое понимание.

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