Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django Rest框架中使用SerializerMethodField进行更新_Python_Django_Django Rest Framework - Fatal编程技术网

Python 如何在Django Rest框架中使用SerializerMethodField进行更新

Python 如何在Django Rest框架中使用SerializerMethodField进行更新,python,django,django-rest-framework,Python,Django,Django Rest Framework,我在ModelSerializer中有一个字段,我已将其设置为SerializerMethodField以修改该字段的get行为。我以前可以更新数据,现在不行。我怎样才能解决这个问题 最初,在不使用SerializerMethodField的情况下,我得到了如下数据: { ... "members": [2,3], ... } 但是我添加了SerializerMethodField来修改数据,然后update停

我在ModelSerializer中有一个字段,我已将其设置为SerializerMethodField以修改该字段的get行为。我以前可以更新数据,现在不行。我怎样才能解决这个问题

最初,在不使用SerializerMethodField的情况下,我得到了如下数据:

    {
        ...
        "members": [2,3],
        ...
    }
但是我添加了SerializerMethodField来修改数据,然后update停止工作

型号.py

# Create your models here.
class Company(models.Model):
    members = ArrayField(models.IntegerField(blank=True), blank=True)
...
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
...
序列化程序.py

# Create your models here.
class Company(models.Model):
    members = ArrayField(models.IntegerField(blank=True), blank=True)
...
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
...

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

  • 或者,您可以创建自定义字段

  • 或者,也可以有其他更简单的挂钩。如果在修改
    成员
    之前“创建”和“更新”按照您的要求工作,那么您可以执行以下操作,将创建和更新请求的所有内容设置为默认值

    • 重写
      \uuuu init\uuu
      方法。
    class CompanySerializer(serializers.ModelSerializer):
    user=UserSerializer(只读=False)
    定义初始化(self,*args,**kwargs):
    super()
    尝试:
    如果['GET']中的self.context['request'].method:
    self.fields['members']=SerializerMethodField()
    除KeyError外:
    通过
    类元:
    模型=公司
    字段='uuu all_uuuu'#('id','name','description','date_created','user','status','theme','members')
    def get_成员(自身、obj):
    accounts=Account.objects.filter(id\u in=obj.members)
    返回AccountSerializer(accounts,many=True)。数据
    ...
    
    • 或者,您可以创建不同的字段来获取成员

    您需要使用不同的序列化程序进行更新和创建。此序列化程序仅适用于get。谢谢,Sagar!:)现在,另一个问题是,当添加一个新项时,结果是:“user_id”列中的null值违反了notnull约束Django。这对我来说意味着什么?)这是另一个问题。不能直接创建/更新嵌套关系(此处为UserSerializer)。