【问题标题】:Django Rest Framework nested relationship sets field 'read_only=True'Django Rest Framework 嵌套关系集字段 'read_only=True'
【发布时间】:2018-06-21 21:06:53
【问题描述】:

我的AirportSerializer 有一个字段city,即通过设置depth=1 嵌套的ForeignField。我需要序列化器返回“机场”的信息和相关的“城市”的信息,所以我需要嵌套对象。问题是当我将深度设置为 1 时,字段“城市”设置为 read_only=True,因此 post 方法会引发“非空”错误,因为该字段是必需的。

我尝试通过设置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 的“城市”字段已经设置为null,所以airport = models.Airport.objects.create(**validated_data) 引发了同样的not null 错误。

所以,最后,我按照文档创建了create() 模型,但“城市”字段仍然是“只读”。

我几乎花了一整天的时间试图找到一种方法让序列化程序返回嵌套的“城市”而不设置字段“城市”read_only 并且没有在过程中强制创建“城市”的新实例.

我将不胜感激。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

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

    1. 只要用外键,前端make就变成http了 请求数据,但最终这是最惯用的方式 做它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多