首页 文章

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

提问于
浏览
1

我有一个看起来像这样的模型:

class Profile(models.Model):
    following = models.ManyToManyField('Profile', related_name='followed')
    admin_notes = models.TextField()

还有一个看起来像这样的Django Rest Framework序列化程序:

class ProfileSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Profile
        fields = '__all__'

创建新的 Profile 时,我想中断save / create以编程方式设置 admin_notes . 我知道在基于函数的视图中如何做到这一点,但这次我使用DRF的视图集,所以我想在序列化程序中执行此操作 . 然而,自我指涉关系给了我麻烦 .

我在_1547384内尝试了这个:

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'

据我所知,Django在两步保存过程中创建了m2m关系,所以错误很有意义,但仍然让我感到困惑的是如何向前发展 . 在给定模型设置方式的情况下,如何在序列化器中设置 admin_notes 的值?

1 回答

  • 2

    试试这个(假设你将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
    

相关问题