Python 使用Django的ModelSerializer验证选项字段
我有一个模型BaseUser,它继承自AbstractUser,并有两个附加字段:complex\u list和active\u complex。复杂列表是一个通过注册表连接到BaseComplex模型的ManyToManyField 我希望active_complex的默认值为null,这可以在模型启动时处理。我还需要用户能够仅从complex_列表中的值中选择活动的_复合体。为此,我尝试使用定制的ModelSerializer:Python 使用Django的ModelSerializer验证选项字段,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个模型BaseUser,它继承自AbstractUser,并有两个附加字段:complex\u list和active\u complex。复杂列表是一个通过注册表连接到BaseComplex模型的ManyToManyField 我希望active_complex的默认值为null,这可以在模型启动时处理。我还需要用户能够仅从complex_列表中的值中选择活动的_复合体。为此,我尝试使用定制的ModelSerializer: from rest_framework import seri
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)
此用户不受任何特定值的约束。此代码仅在类首次初始化时运行一次,而不是在类的每个新实例上运行
相反,您希望在序列化程序类初始化时获取用户,然后填充选项
这是一个粗略的变化,我还没有测试过,但它应该或多或少的工作
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
另外,请注意查看get\u user\u model()
from-最好使用该功能,而不是直接导入用户模型。谢谢。这非常有帮助,尤其是get_user_model()实际上解决了我的问题。只是ChoiceField的'choices'参数应该是一个iterable,它不会将None作为值。因此,为了将来的参考,这项工作只是用一个空列表“[]”来替换None。太棒了,我更新了代码示例。我很高兴能帮上忙。此外,还为您提供了一些道具,帮助您在所有可用的上下文中编写一个格式良好的问题:)