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