gpt4 book ai didi

python - 使用 Django 的 ModelSerializer 验证选择字段

转载 作者:行者123 更新时间:2023-12-05 06:16:42 25 4
gpt4 key购买 nike

我有一个模型 BaseUser,它继承自 AbstractUser 并且有两个附加字段:complex_list 和 active_complex。 complex_list 是一个通过登记表连接到 BaseComplex 模型的 ManyToManyField。

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

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

这是一个粗略的更改,我还没有测试过,但它或多或少应该可以工作。

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

关于python - 使用 Django 的 ModelSerializer 验证选择字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61980969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com