我的AirportSerializer
有一个字段city
,它是通过设置ForeignField
嵌套的depth=1
。我需要序列化程序来返回“机场”的信息和相关“城市”的信息,因此我需要嵌套对象。问题在于,当我将深度设置为1时,字段“ city”被设置为read_only=True
,因此post
方法会引发“ not null”错误,因为该字段是必需的。
我尝试通过设置city = CitySerializer()
来获得所需的嵌套结果,但是这种方法意味着post
方法需要用于创建新的“机场”和新的“城市”的数据也。这不是我想要的。我只希望不要将字段“城市”设置为read_only=True
。
documentation说我必须
创建
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
且不强制在其中创建新的“城市”实例的方法。过程。
我将不胜感激。
答案 0 :(得分:0)
嵌套的序列化操作很棘手,在定义序列化器时是否要创建或设置嵌套对象存在一些歧义。我用不同的方式来处理它。
只需使用外键,您就可以将前端设为http 请求数据,但最终这是最惯用的方式 做到这一点。
在AirportSerializer中使用CitySerializer-让其中一个被读取 只要。有一个只与ID相关的write_city_id字段 在写作上。
get_serializer_class
方法中执行哪个序列化器示例:
def create(self, validated_data):
city = City.objects.get(get_city_somehow(self.context['request']))
airport = models.Airport.objects.create(city=city, **validated_data)