我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是棘手的,定義序列化器與要創建還是設置嵌套的對象存在一些歧義。我用不同的方式處理了它。
只需使用外鍵,您將使前端對數據的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)
添加回答
舉報
0/150
提交
取消