Django Отображение сериализатора наследования нескольких таблиц
Я расширил свою модель следующим образом.
class Item(models.Model):
name = models.CharField(max_length=50)
class Category1(Item):
code = models.CharField(max_length=50)
class Category2(Item):
status = models.IntegerField(default=1)
class Order(models.Model):
# fields
class OrderItem(models.Model):
order = models.ForeignKey("Order", on_delete=models.PROTECT, related_name="order_items")
item = models.ForeignKey("Item", on_delete=models.PROTECT)
Есть ли способ получить доступ к дочерним полям из родительской модели? Из сериализатора мне нужно отобразить все детали из модели Order.
Order -> OrderItem -> Item
Я смог отобразить до деталей Item, но мне нужно отобразить другие поля из Category1 и Category2. Могу ли я как-то выполнить это? Мой сериализатор выглядит следующим образом
class OrderItemSerializer(serializers.ModelSerializer):
class Meta:
model = OrderItem
fields = "__all__"
class OrderSerializer(serializers.ModelSerializer):
order_items = OrderItemSerializer(many=True)
class Meta:
model = Order
fields = "__all__"
Общим ответом будет использование SerializerMethodField, это может быть одним из способов сделать это. Это может выглядеть примерно так:
class OrderItemSerializer(serializers.ModelSerializer):
category_1 = serializers.SerializerMethodField('get_category1')
category_2 = serializers.SerializerMethodField('get_category2')
class Meta:
model = OrderItem
fields = "__all__"
def get_category1(self, instance):
return instance.item.category1.code
def get_category2(self, instance):
return instance.item.category2.status
Но я бы посоветовал упростить дизайн модели, используя внешние ключи вместо наследования (если только это не требуется по другим причинам, тогда вы можете игнорировать следующее).
Быть таким
class Item(models.Model):
name = models.CharField(max_length=50)
class Category1(models.Model):
item = models.ForeignKey(Item, on_delete=models.CASCADE, related_name='item_cat1')
code = models.CharField(max_length=50)
class Category2(models.Model):
item = models.ForeignKey(Item, on_delete=models.CASCADE, related_name='item_cat2')
status = models.IntegerField(default=1)
class Order(models.Model):
order_name = models.CharField(max_length=255)
item = models.ForeignKey("Item", on_delete=models.PROTECT)
Тогда используйте простые вложенные сериализаторы