Django Rest Framework - 使用自引用M2M字段覆盖序列化器创建模型的方法

时间:2017-10-18 20:09:01

标签: django django-rest-framework

我的模型看起来像这样:

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}}的值?

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