Набор форм 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)