2017-08-16 96 views
0

在我的模型Django的REST框架嵌套關係

**in 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

類DistrictSerializer(serializers.ModelSerializer): 類元: 模型=區 字段=('id','name')

class CitySerializer(serializers.ModelSerializer): 個區= DistrictSerializer(多=真,READ_ONLY = TRUE)

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

類ProvinceSerializer(serializers.ModelSerializer): 城市= CitySerializer(多=真,READ_ONLY = TRUE)

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

GET /系統/省/ 1/

我得到JSON字符串像

{ 
"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": [] 
    } 
] 

}

各區JSON是不是我想要的。 如何防止自動加載區

+0

我還需要使用/ API /城市/ 1 /顯示下1城各區。 – huchi

回答

0

(推薦)從下面元類中刪除字段「區」。

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

或者如果您必須更新與此字段相關的任何值,則使用extra_kwargs變量將此字段設置爲write_only。

class Meta: 
    model = City 
    extra_kwargs = {'districts': {'write_only': True}} 
    fields = ('id', 'name', 'districts') 
+0

extra_kwargs無法正常工作。如果我簡單地從City的meta類中刪除'區域',即使沒有extra_kwargs,我也會得到相同的json字符串。 – huchi

+0

extra_kwargs = {'districts':{'read_only':True}}得到正確的json結構,而數據只是pk。我怎麼能改變區的序列化到DistrictSerializer我需要我的json字符串'id','name' – huchi

+0

嗯奇怪....你想這個'區'字段出現在你的迴應中嗎? –

0
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 CityForProvinceSerializer(serializers.ModelSerializer): 

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

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

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


class DynamicFieldsModelSerializer(ModelSerializer): 
    """ 
    A ModelSerializer that takes an additional `fields` argument that 
    controls which fields should be displayed. 
    """ 

    def __init__(self, *args, **kwargs): 
     # Don't pass the 'fields' arg up to the superclass 
     fields = kwargs.pop('fields', None) 
     exclude = kwargs.pop('exclude', None) 

     # Instantiate the superclass normally 
     super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs) 

     if fields is not None: 
      # Drop any fields that are not specified in the `fields` argument. 
      allowed = set(fields) 
      existing = set(self.fields.keys()) 
      for field_name in existing - allowed: 
       self.fields.pop(field_name) 

     if exclude is not None: 
      not_allowed = set(exclude) 
      for exclude_name in not_allowed: 
       self.fields.pop(exclude_name) 


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

class CitySerializer(DynamicFieldsModelSerializer): 
    districts = DistrictSerializer(many=True, read_only=True) 

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

class ProvinceSerializer(serializers.ModelSerializer): 
    cities = serializers.SerializerMethodField() 

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

    def get_cities(self, instance): 
     return CitySerializer(instance.cities.all(), many=True, fields=('id', 'name')).data