2017-08-16 99 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