[英]Django Rest Framework How to update SerializerMethodField
[英]How to update with SerializerMethodField in Django Rest Framework
我的 ModelSerializer 中有一個字段,我已將其設置為 SerializerMethodField 以修改該字段的獲取行為。 我以前可以更新數據,現在我不能。 我該如何解決這個問題?
最初,在不使用 SerializerMethodField 的情況下,我得到了這樣的數據:
{
...
"members": [2,3],
...
}
但我添加了 SerializerMethodField 來修改數據,然后更新停止工作。
模型.py
# Create your models here.
class Company(models.Model):
members = ArrayField(models.IntegerField(blank=True), blank=True)
...
序列化程序.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
...
您需要使用不同的序列化程序進行更新和創建。 此序列化程序僅適用於獲取。
或者,您可以創建自定義字段。 Django Rest Framework 如何更新 SerializerMethodField
或者,可以有其他更簡單的鈎子。 如果 '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
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.