如何在Django Rest Framework中使用SerializerMethodField更新 [英] How to update with SerializerMethodField in Django Rest Framework

查看:211
本文介绍了如何在Django Rest Framework中使用SerializerMethodField更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在ModelSerializer中有一个字段,将其设置为SerializerMethodField来修改该字段的获取行为。我以前可以更新数据,现在不能。我该如何解决呢?

I have a field in my ModelSerializer which I've set as SerializerMethodField to modify the get behaviour for the field. I could update the data before, now I can't. How can I solve this?

最初,没有使用SerializerMethodField,我得到了这样的数据:

Initially, without using SerializerMethodField, I got data like this:

    {
        ...
        "members": [2,3],
        ...
    }

,但是我添加了SerializerMethodField来修改数据,然后更新停止工作。

but I added SerializerMethodField to modify the data, then update stopped working.

models.py

# Create your models here.
class Company(models.Model):
    members = ArrayField(models.IntegerField(blank=True), blank=True)
...

serializers.py

class 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. 您需要使用不同的序列化程序进行更新和创建。此序列化器仅适用于获取。

  1. You need to use different serializers for update and create. This serializer works for get only.

或者,您可以创建一个自定义字段。 Django Rest Framework如何更新SerializerMethodField

Or, you can create a custom field. Django Rest Framework How to update SerializerMethodField

或者,可以有其他更简单的钩子。如果在修改成员之前按需要完成了'create'和'update'的工作,则可以按照以下步骤将所有内容默认为创建和更新请求。

Or, there can be other simpler hooks. If 'create' and 'update' worked as you wanted before modifiying members, then you can do as follow to get everything to default for create and update requests.



  • 覆盖 __ init __ 方法。

    • Override the __init__ method . .
    • 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
        ...
        

        这篇关于如何在Django Rest Framework中使用SerializerMethodField更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆