Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django rest framework nested relationships

In my model

models.py

class Province(models.Model):
    name = models.CharField(max_length=128, verbose_name=u"province")

class City(models.Model):
    province = models.ForeignKey("system.Province", related_name='cities', verbose_name=u"province")
    name = models.CharField(max_length=128, verbose_name=u"name")

class District(models.Model):
    city = models.ForeignKey("system.City", related_name='districts', verbose_name=u"city")
    name = models.CharField(max_length=128, verbose_name=u"name")

serializers.py

class DistrictSerializer(serializers.ModelSerializer):
    class Meta:
        model = District
        fields = ('id', 'name')


class CitySerializer(serializers.ModelSerializer):
    districts = DistrictSerializer(many=True, read_only=True)

    class Meta:
        model = City
        fields = ('id', 'name', 'districts')


class ProvinceSerializer(serializers.ModelSerializer):
    cities = CitySerializer(many=True, read_only=True)

    class Meta:
        model = Province
        fields = ('id', 'name', 'cities')

When i make GET request to the url /system/province/1/, i am getting json string like

{
"id": 1,
"name": "广东省",
"cities": [
    {
        "id": 1,
        "name": "广州市",
        "districts": [
            {
                "id": 1,
                "name": "天河区"
            },
            {
                "id": 2,
                "name": "海珠区"
            }
        ]
    },
    {
        "id": 2,
        "name": "汕头市",
        "districts": [
            {
                "id": 3,
                "name": "朝阳区"
            }
        ]
    },
    {
        "id": 3,
        "name": "湛江市",
        "districts": []
    },
    {
        "id": 4,
        "name": "韶关市",
        "districts": []
    }
]

}

the districts json is not what i want。 how can i prevent auto load districts

like image 427
huchi Avatar asked Feb 06 '26 17:02

huchi


1 Answers

(Recommended) Remove the field 'district' from below meta class.

class Meta:
    model = City
    fields = ('id', 'name')

Or if you have to update any values related to this field then make this field write_only using extra_kwargs variable.

class Meta:
    model = City
    extra_kwargs = {'districts': {'write_only': True}}
    fields = ('id', 'name', 'districts')
like image 133
Ankur Sharma Avatar answered Feb 12 '26 10:02

Ankur Sharma



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!