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