猿问

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

我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,也无需在过程中强制创建“城市”的新实例。



沧海一幻觉
浏览 344回答 1
1回答

函数式编程

嵌套的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)
随时随地看视频慕课网APP

相关分类

Python
我要回答