Я пытаюсь решить проблему, связанную с наследованием модели в Django.У меня есть четыре соответствующие модели: Order
, OrderItem
, для которого ForeignKey равен Order
, а затем есть модель Orderable
, которая является суперклассом наследования моделей для дочерних моделей, таких как Fee
, RentedProduct
и т. Д. В python этовыглядит так (размещение только релевантных частей):
class Orderable(models.Model):
real_content_type = models.ForeignKey(ContentType, editable=False)
objects = OrderableManager()
available_types = []
def save(self, *args, **kwargs):
"""
Saves instance and stores information about concrete class.
"""
self.real_content_type = ContentType.objects.get_for_model(type(self))
super(Orderable, self).save(*args, **kwargs)
def cast(self):
"""
Casts instance to the most concrete class in inheritance hierarchy possible.
"""
return self.real_content_type.get_object_for_this_type(pk=self.pk)
@staticmethod
def register_type(type):
Orderable.available_types.append(type)
@staticmethod
def get_types():
return Orderable.available_types
class RentedProduct(Orderable):
"""
Represent a product which is rented to be part of an order
"""
start_at = models.ForeignKey(Storage, related_name='starting_products',
verbose_name=_('Start at'))
real_start_at = models.ForeignKey(Storage, null=True,
related_name='real_starting_products', verbose_name=_('Real start at'))
finish_at = models.ForeignKey(Storage, related_name='finishing_products',
verbose_name=_('Finish at'))
real_finish_at = models.ForeignKey(Storage, null=True,
related_name='real_finishing_products', verbose_name=_('Real finish at'))
target = models.ForeignKey(Product, verbose_name=_('Product'))
Orderable.register_type(RentedProduct)
class OrderItem(BaseItem):
unit_price = models.DecimalField(max_digits=8, decimal_places=2,
verbose_name=_('Unit price'))
count = models.PositiveIntegerField(default=0, verbose_name=_('Count'))
order = models.ForeignKey('Order', related_name='items',
verbose_name=_('Order'))
discounts = models.ManyToManyField(DiscountDescription,
related_name='order_items', through=OrderItemDiscounts, blank=True,
verbose_name=_('Discounts'))
target = models.ForeignKey(Orderable, related_name='ordered_items',
verbose_name=_('Target'))
class Meta:
unique_together = ('order', 'target')
Я хотел бы привязать строку к модели заказа, чтобы можно было редактировать элементы заказа.Проблема заключается в том, что поле назначения в OrderItem указывает на Orderable (не конкретный класс, который можно получить, вызвав метод cast
Orderable), и поэтому встроенная форма не является полной.
Есть ли у кого-нибудь идея?Как создать хотя бы немного удобный интерфейс для этого?Может ли это быть решено только в админке Django, или вы бы предложили создать специальный пользовательский интерфейс?
Заранее благодарим за любые советы.