繁体   English   中英

使用带有 Django 的 ModelSerializer 验证选择字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM