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