如何在Django Rest Framework中使用SerializerMethodField更新 [英] How to update with SerializerMethodField in Django Rest Framework
问题描述
我在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
...
推荐答案
-
您需要使用不同的序列化程序进行更新和创建。此序列化器仅适用于获取。
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屋!