ama*_*oup 4 django serialization json nested django-rest-framework
我有以下型号:
class SearchCity(models.Model):
city = models.CharField(max_length=200)
class SearchNeighborhood(models.Model):
city = models.ForeignKey(SearchCity, on_delete=models.CASCADE)
neighborhood = models.CharField(max_length=200)
Run Code Online (Sandbox Code Playgroud)
然后是以下嵌套序列化程序:
class CityNeighborhoodReadOnlySerializer(serializers.ModelSerializer):
searchneighborhood_set = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = SearchCity
fields = ('city','searchneighborhood_set')
read_only_fields =('city', 'searchneighborhood_set')
Run Code Online (Sandbox Code Playgroud)
与视图配对:
class CityNeighborhoodView(ListAPIView):
queryset = SearchCity.objects.all()
serializer_class = CityNeighborhoodReadOnlySerializer
Run Code Online (Sandbox Code Playgroud)
当我进行 api 调用时,我得到了这个:
city: "Chicago"
searchneighborhood_set:
0: 5
1: 4
2: 3
city: "New York"
searchneighborhood_set:
0: 8
1: 7
2: 6
Run Code Online (Sandbox Code Playgroud)
我只是获取相关对象的主键。哪个好,我需要那个,但我也想要这个neighborhood名字,我怎么得到这个名字?
编辑:
这个问题可能会带来一些启发。他们没有使用与主键相关的序列化器,所以我的问题是(如果这当然有效,那么与主键相关的序列化器的意义是什么?
答案是不使用primarykeyrelatedserializer而是使用用于序列化Searchneighborhood对象的序列化程序。
我改变了这个:
class CityNeighborhoodReadOnlySerializer(serializers.ModelSerializer):
searchneighborhood_set = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = SearchCity
fields = ('city','searchneighborhood_set')
read_only_fields =('city', 'searchneighborhood_set')
Run Code Online (Sandbox Code Playgroud)
对此:
class CityNeighborhoodReadOnlySerializer(serializers.ModelSerializer):
searchneighborhood_set = SearchNeighborhoodSerializer(many=True, read_only=True)
class Meta:
model = SearchCity
fields = ('city','searchneighborhood_set')
read_only_fields =('city', 'searchneighborhood_set')
Run Code Online (Sandbox Code Playgroud)
并从这个输出出发:
city: "Chicago"
searchneighborhood_set:
0: 5
1: 4
2: 3
city: "New York"
searchneighborhood_set:
0: 8
1: 7
2: 6
Run Code Online (Sandbox Code Playgroud)
我想要的那个:
city: Chicago
searchneighborhood_set:
0: {pk: 5, neighborhood: 'River North}
....
Run Code Online (Sandbox Code Playgroud)
但是现在出现了一个新问题,主键相关序列化器的意义何在?