为了账号安全,请及时绑定邮箱和手机立即绑定

Django Rest Framework嵌套关系集字段“ read_only = True”

Django Rest Framework嵌套关系集字段“ read_only = True”

沧海一幻觉 2021-03-31 14:10:36
我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是棘手的,定义序列化器与要创建还是设置嵌套的对象存在一些歧义。我用不同的方式处理了它。

  1. 只需使用外键,您将使前端对数据的http请求进行处理,但最终这是最惯用的方式。

  2. 在AirportSerializer中使用CitySerializer-让那是只读的。有一个只写城市ID字段,该字段仅与写入时的ID相关。

  3. 使用不同的序列化程序,一个与CitySerializer一起使用,另一个与唯一的id一起使用,确定在视图的get_serializer_class方法中执行哪一个

  4. 使用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)


查看完整回答
反对 回复 2021-04-13
  • 1 回答
  • 0 关注
  • 343 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信