Набор форм 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 напрямую, используя многотабличное наследование. Производительность в данном случае не является проблемой, так как предпочтительнее масштабируемость. Буду признателен за любой совет.

I think for this case django BaseFormSet might do the trick for example as you can see Django BaseFormset can able to help you to do fill up mutliple model instances at single go, Read the django docs about more, you will get the idea of it.Below is just a

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)

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