Python 如何在Django Rest框架中使用SerializerMethodField进行更新
我在ModelSerializer中有一个字段,我已将其设置为SerializerMethodField以修改该字段的get行为。我以前可以更新数据,现在不行。我怎样才能解决这个问题 最初,在不使用SerializerMethodField的情况下,我得到了如下数据:Python 如何在Django Rest框架中使用SerializerMethodField进行更新,python,django,django-rest-framework,Python,Django,Django Rest Framework,我在ModelSerializer中有一个字段,我已将其设置为SerializerMethodField以修改该字段的get行为。我以前可以更新数据,现在不行。我怎样才能解决这个问题 最初,在不使用SerializerMethodField的情况下,我得到了如下数据: { ... "members": [2,3], ... } 但是我添加了SerializerMethodField来修改数据,然后update停
{
...
"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
...
成员
之前“创建”和“更新”按照您的要求工作,那么您可以执行以下操作,将创建和更新请求的所有内容设置为默认值
- 重写
方法。\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)。