[英]Validating a choice field with ModelSerializer with Django
我有一個 model BaseUser ,它繼承自AbstractUser並有兩個附加字段:complex_list 和 active_complex。 complex_list 是一個 ManyToManyField,通過一個登記表連接到BaseComplex model。
我希望 active_complex 的默認值為 null 可以在 model 啟動時處理。 我還需要用戶能夠僅從 complex_list 中的值中選擇 active_complex。 為此,我嘗試使用定制的 ModelSerializer:
from rest_framework import serializers
from .models import BaseUser
class ActiveComplexSerializer(serializers.ModelSerializer):
this_user = serializers.SerializerMethodField('get_this_user')
choice =[]
qs = BaseUser.objects.get(username = this_user)
for cmplx in qs.complex_list:
choice.append((cmplx.id, cmplx.name))
active_complex = serializers.ChoiceField(choices = choice)
class Meta:
model = BaseUser
fields = ('active_complex')
def get_this_user(self, request):
return request.user
我知道我做錯了什么,因為我得到一個查詢未找到錯誤。 如果您能糾正這一點或提出更好的方法來實現相同的目標,我將不勝感激。
當前代碼的問題是當你打電話時
qs = BaseUser.objects.get(username = this_user)
this_user
未綁定到任何特定值。 此代碼僅在 Class 首次初始化時運行一次,而不是在 class 的每個新實例上運行。
相反,您希望在初始化序列化程序 class 時獲取用戶,然后填充選項。
這是一個粗略的更改,我沒有對此進行測試,但它或多或少應該可以工作。
class ActiveComplexSerializer(serializers.ModelSerializer):
this_user = serializers.SerializerMethodField('get_this_user')
active_complex = serializers.ChoiceField(choices=[])
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
choice =[]
qs = BaseUser.objects.get(username = self.fields['this_user'])
for cmplx in qs.complex_list:
choice.append((cmplx.id, cmplx.name))
self.fields['active_complex'].choices = choice
class Meta:
model = BaseUser
fields = ('active_complex')
def get_this_user(self, request):
return request.user
另請注意,從https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#django.contrib.auth.get_user_model查看get_user_model()
- 最好使用 ZC1C425268E68385D1AB5074C17A94F14 而不是 direclty導入用戶 model。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.