我的模型看起来像这样:
class ProfileSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Profile
fields = '__all__'
一个看起来像这样的Django Rest Framework序列化器:
Profile
创建新admin_notes
时,我想中断save / create以编程方式设置ProfileSerializer
。我知道在基于函数的视图中如何做到这一点,但这次我使用的是DRF的视图集,所以我想在序列化程序中执行此操作。然而,自我指涉关系给了我麻烦。
我在def create(self, **validated_data):
p = Profile(**validated_data)
p.admin_notes = 'Test'
p.save()
:
Profile.objects.create
这一点,以及尝试Profile
而不是仅在第一行中创建新的Exception Value: "<Profile>" needs to have a value for field "id" before this many-to-many relationship can be used.
实例,会导致以下错误:
def create(self, validated_data):
validated_data['admin_notes'] = 'Test'
return super(ProfileSerializer, self).create(**validated_data)
试试这个:
Exception Value: create() got an unexpected keyword argument 'following'
导致此错误:
admin_notes
据我所知,Django在两步保存过程中创建了m2m关系,所以错误很有意义,但仍然让我感到困惑,因为我可以向前迈进。如何根据我的模型设置方式在序列化器中设置{{1}}的值?
答案 0 :(得分:3)
试试这个(假设您将Profile实例的ID传递给m2m字段):
def create(self, validated_data):
# First, remove following from the validated_data dict...
following_data = validated_data.pop('following', None)
# Set the admin_notes custom value...
validated_data['admin_notes'] = 'Test'
# Create the object instance...
profile = Profile.objects.create(**validated_data)
# Finally, add your many-to-many relationships...
if following_data:
for data in following_data:
profile.followed.add(Profile.objects.get(**data))
return profile