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)

Тогда используйте простые вложенные сериализаторы

Вернуться на верх