I.Z.
I.Z.

Reputation: 197

Django. Rest Framework. Nested relationships empty result

Need some advice. I set up seralization. There are no errors. But at the output I get empty tags. I broke my head, what am I doing wrong?

models.py:

class kv(models.Model):
    title = models.CharField(max_length=200)
    price = models.IntegerField()
    address = models.CharField(max_length=200)
    property_type = models.CharField(choices=realty_type_choices_admin, default='kv',
                                     max_length=200, blank=True)

    country = models.CharField(default='Россия', max_length=200)
    region = models.CharField(max_length=200)
    state = models.CharField(choices=state_choices_admin, default='DGO', max_length=200, blank=True, null=True)
    locality_name = models.CharField(max_length=200, blank=True, null=True)
    address_xml = models.CharField(max_length=200, blank=True, null=True)
    city = models.CharField(max_length=100, blank=True, null=True)

serializers.py

from rest_framework import serializers
from listings.models import kv

class kvSerializerLocation(serializers.ModelSerializer):
    class Meta:
        model = kv
        fields = ['country', 'region', 'state', 'locality_name', 'address_xml', 'city']


class kvSerializer(serializers.ModelSerializer):
    category = serializers.CharField(source='get_property_type_display')
    url = serializers.CharField(source='get_absolute_url', read_only=True)
    country = kvSerializerLocation()

    class Meta:
        model = kv
        fields = ['title', 'price', 'address', 'category', 'url', 'country']

views.py

from listings.models import *
from rest_framework import viewsets
from rest_framework_xml.renderers import XMLRenderer
from .serializers import kvSerializer

class KvXMLRenderer(XMLRenderer):
    root_tag_name = 'feed'
    item_tag_name = 'offer'

    def _to_xml(self, xml, data):
        super()._to_xml(xml, data)

class kvViewSet(viewsets.ModelViewSet):
    queryset = Kvartiry.objects.all().filter(is_published=True)
    serializer_class = kvSerializer
    renderer_classes = [KvXMLRenderer]

Result:

<country>
    <state/>
    <locality_name/>
    <address_xml/>
    <city/>
</country>

It’s strange. Tags are empty, there is no region tag at all

Thank!

Upvotes: 0

Views: 251

Answers (1)

ruddra
ruddra

Reputation: 51978

I don't think your implemenration would work for country because its a field, and there is no way to map that country value to your kv instance which can be utilized by kvSerializerLocation. Instead use SerializerMethodField:

class kvSerializer(serializers.ModelSerializer):  # please use PascalCase for defining class name
    category = serializers.CharField(source='get_property_type_display')
    url = serializers.CharField(source='get_absolute_url', read_only=True)
    kv_country = serializers.SerializerMethodField()

    class Meta:
        model = kv
        fields = ['title', 'price', 'address', 'category', 'url', 'kv_country']

    def get_kv_country(self, obj):
        return kvSerializerLocation(obj).data

Upvotes: 1

Related Questions