Bee*_*nce 4 python django django-rest-framework
我的 ModelSerializer 中有一个字段,我已将其设置为 SerializerMethodField 来修改该字段的获取行为。以前可以更新数据,现在不行了。我该如何解决这个问题?
最初,在不使用 SerializerMethodField 的情况下,我得到了如下数据:
{
...
"members": [2,3],
...
}
Run Code Online (Sandbox Code Playgroud)
但我添加了 SerializerMethodField 来修改数据,然后更新停止工作。
模型.py
# Create your models here.
class Company(models.Model):
members = ArrayField(models.IntegerField(blank=True), blank=True)
...
Run Code Online (Sandbox Code Playgroud)
序列化器.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
...
Run Code Online (Sandbox Code Playgroud)
您需要使用不同的序列化器进行更新和创建。该序列化器仅适用于获取。
或者,您可以创建自定义字段。Django Rest Framework 如何更新 SerializerMethodField
或者,可以有其他更简单的钩子。如果“创建”和“更新”在修改之前按您想要的方式工作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
Run Code Online (Sandbox Code Playgroud)
__init__方法。。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
Run Code Online (Sandbox Code Playgroud)
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
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4042 次 |
| 最近记录: |