Набор форм 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
элементов, где каждый элемент может иметь различные поля?
Пример:
OrderItem
: [SomeProduct1Schema
]\ категория \ количество \ марка \ модель \ размер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)