【问题标题】:django rest-framework add fields to ModelSerializerdjango rest-framework 向 ModelSerializer 添加字段
【发布时间】:2023-11-16 18:47:01
【问题描述】:

我有以下序列化程序:

class AMXModXAdminsSerializer(mixins.GetCSConfigMixin, serializers.ModelSerializer):
    admin = serializers.CharField(label='Admin', max_length=35, required=True, write_only=True)
    password = serializers.CharField(label='Password', max_length=35, required=False, write_only=True)
    access_flags = serializers.MultipleChoiceField(choices=ACCESS_FLAGS_OPTIONS, required=True, write_only=True)
    account_flags = serializers.MultipleChoiceField(choices=ACCOUNT_FLAGS_OPTIONS, required=True, write_only=True)

    class Meta:
        model = CS16Server
        fields = ('name', 'amxadmins', 'admin', 'password', 'access_flags', 'account_flags')
        read_only_fields = ('name', 'amxadmins',)

当我尝试访问它抱怨的网址时:

Got AttributeError when attempting to get a value for field `admin` on serializer `AMXModXAdminsSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `CS16Server` instance.
Original exception text was: 'CS16Server' object has no attribute 'admin'.

如果我将 write_only 添加到每个字段,错误就会消失。

问题是我有一个类似的序列化程序,用于相同的模型,具有不属于该模型的字段,并且它可以完美地工作而无需在每个字段中添加“write_only=True”。

知道为什么一个可以工作而另一个不行吗?

【问题讨论】:

    标签: django-rest-framework


    【解决方案1】:

    “当我访问时”是什么意思?发布补丁?

    错误提示:

    'CS16Server' object has no attribute 'admin'.
    

    是吗?如果没有,你打算把它写到哪里? 如果模型没有管理字段(如错误中所述),您需要这样的内容:

    class AMXModXAdminsSerializer(mixins.GetCSConfigMixin, serializers.ModelSerializer):
        admin= serializers.SerializerMethodField()
        fields ...
        ...
        def get_admin(self, obj):
            do somthing with self (contains the request) or the obj you're working on 
            return theOUTcome
    

    【讨论】:

    • 我只是在发布东西时需要它,然后我会获取值并将其引入另一个字段我有几个不在模型上的字段,获取值,对它们进行操作& 然后在模型上存在的字段上引入一个新值。
    • 逻辑应该进入get_admin方法。你可以导入其他模型,做任何事
    【解决方案2】:

    如果您设置 required=False 它不会再抱怨,因为它不会尝试从 db 获取这些字段值。

    【讨论】: