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

2024-10-01 02:37:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我的AirportSerializer有一个字段city,这是一个通过设置depth=1嵌套的ForeignField。我需要序列化程序返回“Airport”和相关“City”的信息,所以我需要嵌套这些对象。问题是当我将depth设置为1时,字段'city'被设置为read_only=True,因此post方法会产生一个“not null”错误,因为该字段是必需的。在

我尝试设置city = CitySerializer(),得到了我需要的嵌套结果,但是这种方法意味着post方法需要数据来创建新的“机场”和新的“城市”。这不是我想要的。我只希望字段'city'不被设置read_only=True。在

documentation说我必须

create create() and/or update() methods in order to explicitly specify how the child relationships should be saved

我试过用这个序列化程序:

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的de'city'字段已经设置为null,因此airport = models.Airport.objects.create(**validated_data)会产生相同的not null错误。在

因此,最后,我根据文档创建了create()模型,但是“city”字段仍然是“read-only”。在

我花了几乎一整天的时间试图让序列化程序返回一个嵌套的“city”,而不设置字段“city”read_only,并且在此过程中不强制创建一个新的“city”实例。在

我会很感激你的帮助。在


Tags: 方法程序cityonlyreaddata序列化models
1条回答
网友
1楼 · 发布于 2024-10-01 02:37:41

嵌套序列化是很棘手的,在定义序列化程序时,是否要创建或设置嵌套对象存在一些模糊性。我用不同的方法处理过。在

  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)

相关问题 更多 >