我AirportSerializer有一个字段city,它是ForeignField按设置嵌套的depth=1。我需要序列化程序来返回“机场”的信息和相关的“城市”的信息,因此我需要嵌套对象。问题在于,read_only=True当我将深度设置为1时,设置了“城市”字段,因此该post方法会引发“ not null”错误,因为该字段是必填字段。我通过设置进行尝试city = CitySerializer(),得到了所需的嵌套结果,但是这种方法意味着一种post方法需要数据来创建新的“机场”和新的“城市”。这不是我想要的。我只希望不设置“城市”字段read_only=True。该文件说,我必须创建create()和/或update()方法,以明确指定应如何保存子关系我使用此序列化程序尝试了此操作:class AirportSerializer(serializers.ModelSerializer): class Meta: model = models.Airport fields = ('id', 'city', 'name', 'iata') depth = 1 def create(self, validated_data): airport = models.Airport.objects.create(**validated_data) return airport但是validated_data获取“ city”字段已经设置为null,因此airport = models.Airport.objects.create(**validated_data)会引发相同的not null错误。因此,最后,我create()根据文档创建了模型,但是“ city”字段仍为“ read_only”。我几乎全天都在花时间试图寻找一种方法让序列化程序返回嵌套的“城市”,而无需设置字段“城市” read_only,也无需在过程中强制创建“城市”的新实例。
1 回答
函数式编程
TA贡献1807条经验 获得超9个赞
嵌套的serializition是棘手的,定义序列化器与要创建还是设置嵌套的对象存在一些歧义。我用不同的方式处理了它。
只需使用外键,您将使前端对数据的http请求进行处理,但最终这是最惯用的方式。
在AirportSerializer中使用CitySerializer-让那是只读的。有一个只写城市ID字段,该字段仅与写入时的ID相关。
使用不同的序列化程序,一个与CitySerializer一起使用,另一个与唯一的id一起使用,确定在视图的
get_serializer_class
方法中执行哪一个使用CitySerializer,然后按照create()方法获取所需的城市。
例子:
def create(self, validated_data): city = City.objects.get(get_city_somehow(self.context['request'])) airport = models.Airport.objects.create(city=city, **validated_data)
添加回答
举报
0/150
提交
取消