使用 ModelSerializer 与 Django 验证选择字段



我有一个模型BaseUser,它继承自AbstractUser,并有两个附加字段:complex_list和active_complex.complex_list是一个通过注册表连接到BaseComplex模型的ManyToManyField。

我希望active_complex的默认值为 null,可以在模型启动时处理。我还需要用户能够仅从complex_list中的值中选择active_complex。为此,我尝试使用自定义的模型序列化程序:

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 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()- 最好使用该函数而不是直接导入用户模型。

最新更新