为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Django Rest Framework 中使用 SerializerMethod

如何在 Django Rest Framework 中使用 SerializerMethod

叮当猫咪 2023-04-25 17:06:27
我的 ModelSerializer 中有一个字段,我已将其设置为 SerializerMethodField 以修改该字段的获取行为。我以前可以更新数据,现在我不能。我该如何解决这个问题?最初,在不使用 SerializerMethodField 的情况下,我得到了这样的数据:    {        ...        "members": [2,3],        ...    }但我添加了 SerializerMethodField 来修改数据,然后更新停止工作。models.py# Create your models here.class Company(models.Model):    members = ArrayField(models.IntegerField(blank=True), blank=True)...serializers.pyclass AccountSerializer(serializers.ModelSerializer):    user=serializers.StringRelatedField(read_only=False)    class Meta:        model=Account        fields='__all__'class UserSerializer(serializers.ModelSerializer):    class Meta:        model = User        fields = '__all__'class CompanySerializer(serializers.ModelSerializer):    user = UserSerializer(read_only=False)    members = serializers.SerializerMethodField()    class Meta:        model = Company        fields = '__all__' #('id', 'name', 'description', 'date_created', 'user', 'status', 'theme', 'members')    def get_members(self, obj):        accounts = Account.objects.filter(id__in=obj.members)        return AccountSerializer(accounts, many=True).data...
查看完整描述

1 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

  1. 您需要使用不同的序列化程序进行更新和创建。此序列化程序仅适用于获取。

  2. 或者,您可以创建自定义字段。

  3. 或者,可以有其他更简单的钩子。如果 'create' 和 'update' 在修改之前如您所愿地工作members,那么您可以按照以下步骤将创建和更新请求的所有内容设置为默认值。

  • 而不是使用SerializerMethodField,覆盖序列化器表示。

class CompanySerializer(serializers.ModelSerializer):

    user = UserSerializer(read_only=False)


    class Meta:

        model = Company

        fields = ('id', 'name', 'description', 'date_created', 'user', 'status', 'theme', 'members', 'members_data')


    def to_representation(self, obj)

        ret = super().to_representation(obj)

        ret["members"] = AccountSerializer(accounts, many=True).data

        return ret


覆盖__init__方法。.

class CompanySerializer(serializers.ModelSerializer):

    user = UserSerializer(read_only=False)


    def __init__(self, *args, **kwargs):

        super().__init__(*args, **kwargs)


        try:

            if self.context['request'].method in ['GET']:

                self.fields['members'] = SerializerMethodField()

        except KeyError:

            pass


    class Meta:

        model = Company

        fields = '__all__' #('id', 'name', 'description', 'date_created', 'user', 'status', 'theme', 'members')


    def get_members(self, obj):

        accounts = Account.objects.filter(id__in=obj.members)

        return AccountSerializer(accounts, many=True).data

...

或者,您可以创建不同的字段来获取成员。

class CompanySerializer(serializers.ModelSerializer):

    user = UserSerializer(read_only=False)

    members_data = SerializerMethodField()


    class Meta:

        model = Company

        fields = ('id', 'name', 'description', 'date_created', 'user', 'status', 'theme', 'members', 'members_data')


    def get_members_data(self, obj):

        accounts = Account.objects.filter(id__in=obj.members)

        return AccountSerializer(accounts, many=True).data

...


查看完整回答
反对 回复 2023-04-25
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信