亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

滄海一幻覺 2021-03-31 14:10:36
我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是棘手的,定義序列化器與要創建還是設置嵌套的對象存在一些歧義。我用不同的方式處理了它。

  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)


查看完整回答
反對 回復 2021-04-13
  • 1 回答
  • 0 關注
  • 423 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號