Набор форм Django с вложенной одиночной инлайн-формой каждого объекта набора форм (форма)

Я пытаюсь понять логику построения такой структуры:

class Order(models.Model):
    id = ...

class OrderItem(models.Model):
    order = FK(Order)
    quantity = CharField()
    category = CharField(choices=..)

class OrderItemSchema(models.Model):
    class Meta:
        abstract = True

    order_item = OneToOneField(OrderItem)
    brand = CharField()
    model = CharField()

class SomeProduct1Schema(OrderItemSchema):
    size = PositivieIntegerField()

class SomeProduct2Schema(OrderItemSchema):
    weight = CharField()
    type = CharField()

Допустим, некий заказчик создал новый Order, который «Компания» должна производить. Существуют различные типы продуктов (не очень много: 2-10), которые могут не иметь даже одного общего параметра/поля, но все же быть размещены в одном Order. Вопрос заключается в следующем:

Как управлять набором форм (или есть другой способ?) из OrderItem элементов, где каждый элемент может иметь различные поля?

Пример:

  1. OrderItem: [SomeProduct1Schema]\ категория \ количество \ марка \ модель \ размер
  2. OrderItem: [SomeProduct2Schema] \ категория \ количество \ бренд \ модель \ вес \ тип

До сих пор я добавлял OrderItem инлайновый набор форм к Order и оба SomeProduct1Schema \ SomeProduct2Schema инлайновых набора форм, присоединенных к OrderItemFormSet в качестве вложенных форм. Но это хорошо работает с одним классом вложенных форм и становится беспорядочным, когда нужно обработать несколько динамически.

Теперь я думаю сделать так, чтобы классы SomeProduct1Schema наследовались от OrderItem напрямую, используя многотабличное наследование. Производительность в данном случае не является проблемой, так как предпочтительнее масштабируемость. Буду признателен за любой совет.

Я думаю, что в этом случае django BaseFormSet может помочь, например, как вы можете видеть, Django BaseFormset может помочь вам заполнить несколько экземпляров модели за один раз, подробнее читайте в документации django, и вы получите представление об этом.Ниже приведен всего лишь

class SomeProduct1Form(OrderItemForm):
    size = forms.IntegerField()

class SomeProduct2Form(OrderItemForm):
    weight = forms.CharField()
    type = forms.CharField()

# Custom FormSet
class CustomOrderItemFormSet(BaseFormSet):
    def add_fields(self, form, index):
        super().add_fields(form, index)
        # add product-specific fields
        if form.instance.category == 'foo':
            form.fields['size'] = forms.IntegerField()
        elif form.instance.category == 'foo2':
            form.fields['weight'] = forms.CharField()
            form.fields['type'] = forms.CharField()

# Create a formset factory
OrderItemFormSet = formset_factory(OrderItemForm, formset=CustomOrderItemFormSet)

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