考慮:
class CouponSerializer(serializers.ModelSerializer):
courses = serializers.PrimaryKeyRelatedField(
many=True, read_only=True)
class Meta:
model = Coupon
exclude = ['users']
如果我洗掉read_only=True,我會收到錯誤:
AssertionError: Relational field must provide a `queryset` argument, override `get_queryset`, or set read_only=`True`.
該檔案指出:
驗證欄位輸入時用于模型實體查找的查詢集。關系必須顯式設定查詢集,或設定 read_only=True
這個要求背后的邏輯是什么?為什么沒有這樣的要求StringRelatedField?
uj5u.com熱心網友回復:
如果用戶在請求中發送的數字有效,Django Rest Framework 必須知道要查找哪個查詢集。
假設用戶向使用此序列化程式的視圖發送 POST 請求。使用這樣的有效載荷:
{
"courses": [1, 2, 3]
}
因此,我們要創建一個 的實體,Coupon其欄位courses將填充Courseid 為 1、2 和 3的實體。
DRF 將驗證此請求以確保模型中存在主鍵 1、2 和 3 Course。如果我們不添加,queryset = Course.objects.all()則 DRF 不知道要查看哪個模型。
您不必添加的原因StringRelatedField是因為默認情況下該型別的欄位是只讀的。
編輯:
如果您使用read_only=True,則 DRF 將在與您在序列化程式上定義的欄位名稱相同的欄位名稱上檢入模型。在您的示例序列化程式中,您已將欄位命名為欄位courses,因此 DRF 將檢查模型中是否有名為欄位的模型,courses并且它知道這是一個多對多欄位,因此它將從中獲取所有主鍵。
您可能會問自己,為什么 DRF 在寫入時不做同樣的事情。即使用序列化程式中的欄位名稱來找出該欄位在模型中參考的模型。但是,我對此沒有很好的答案。
uj5u.com熱心網友回復:
如果您只想使用此序列化程式查看資料,則需要添加 ready_only,如果要保存資料,則需要使用 queryset 引數,這讓序列化程式在將資料保存到資料庫之前驗證資料
例子
class CouponSerializer(serializers.ModelSerializer):
courses = serializers.PrimaryKeyRelatedField(
many=True, queryset = Course.objects.all() )
class Meta:
model = Coupon
exclude = ['users']
如果您的課程串列中沒有課程,則在驗證資料時會引發錯誤
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/343432.html
上一篇:在Django的simple_history中使用diff_against時如何指定“excluded_fields”
