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

时间:2018-06-21 21:06:53

标签: python django django-rest-framework

我的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且不强制在其中创建新的“城市”实例的方法。过程。

我将不胜感激。

1 个答案:

答案 0 :(得分:0)

嵌套的序列化操作很棘手,在定义序列化器时是否要创建或设置嵌套对象存在一些歧义。我用不同的方式来处理它。

  1. 只需使用外键,您就可以将前端设为http 请求数据,但最终这是最惯用的方式 做到这一点。

  2. 在AirportSerializer中使用CitySerializer-让其中一个被读取 只要。有一个只与ID相关的write_city_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)