joe
joe

Reputation: 9484

Nested Django REST

It seems very simple to do nested serializer in Django REST.
But I can not find anything wrong in my code.carts does not shown up
I had followed http://www.django-rest-framework.org/api-guide/relations/#nested-relationships
Only one thing different is I use JSONField.
It should not be a problem.

class MailAPIOrderItemSerializer(serializers.ModelSerializer):
    product = serializers.SerializerMethodField()
    category = serializers.SerializerMethodField()
    variant = serializers.SerializerMethodField()

    class Meta:
        model = OrderItem
        fields = ('category', 'product', 'variant')

    def get_variant(self, obj: OrderItem):
        return obj.product.get('level_two')

    def get_category(self, obj: OrderItem):
        return obj.product.get('service_name')

    def get_product(self, obj: OrderItem):
        return obj.product.get('product_name')

class MailAPIOrderSerializer(serializers.ModelSerializer):
    ...
    carts = MailAPIOrderItemSerializer(many=True, read_only=True)

    class Meta:
        model = Order
        fields = (
            ...
            'carts'
        )

    def get_staff_name(self, order: Order):
        return order.staff.full_name

class OrderItem(AbstractSoftModelController):
    order = models.ForeignKey(Order, related_name='order_items', verbose_name=_('Order'))
    product = JSONField(verbose_name=_('Product'))

My Temporal Solution:
Right now. I am working around by replacing
carts = serializers.SerializerMethodField()
And in the method I use

def get_carts(self, order: Order):
    qs = order.order_items.all()
    serializer = MailAPIOrderItemSerializer(qs, many=True)
    return serializer.data

Upvotes: 0

Views: 53

Answers (1)

neverwalkaloner
neverwalkaloner

Reputation: 47354

In model Order you have backref field order_items not carts. So try change field name in MailAPIOrderSerializer:

order_items = MailAPIOrderItemSerializer(many=True, read_only=True)

class Meta:
    model = Order
    fields = (
        ...
        'order_items'
    )

Upvotes: 1

Related Questions