Python 使用Django的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

我有一个模型BaseUser,它继承自AbstractUser,并有两个附加字段:complex\u list和active\u complex。复杂列表是一个通过注册表连接到BaseComplex模型的ManyToManyField

我希望active_complex的默认值为null,这可以在模型启动时处理。我还需要用户能够仅从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)
此用户不受任何特定值的约束。此代码仅在类首次初始化时运行一次,而不是在类的每个新实例上运行

相反,您希望在序列化程序类初始化时获取用户,然后填充选项

这是一个粗略的变化,我还没有测试过,但它应该或多或少的工作

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。太棒了,我更新了代码示例。我很高兴能帮上忙。此外,还为您提供了一些道具,帮助您在所有可用的上下文中编写一个格式良好的问题:)