【问题标题】:Model Serializer destroy method模型序列化器销毁方法
【发布时间】:2018-12-29 11:01:27
【问题描述】:

我有一个名为 Profile 的模型,它是 Django 的 User 模型的包装器。现在,我通过以下方式创建了一个ProfileSerializer:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email', 'password')

class ProfileSerializer(serializers.ModelSerializer):
    user = UserSerializer(required=True)

    def create(self, validated_data):
        user_data = validated_data.pop('user')
        user = User.objects.create_user(**user_data, username=validated_data.get('username'))
        profile = Profile.objects.create(user=user, **validated_data)
        return profile
    
    def update(self, instance, validated_data):
        instance.dob = validated_data.get('dob', instance.dob)
        instance.karma = validated_data.get('karma', instance.karma)
        instance.username = validated_data.get('username', instance.username)
        user_data = validated_data.pop('user')
        instance.user.first_name = user_data.get('first_name', instance.user.first_name)
        instance.user.last_name = user_data.get('last_name', instance.user.last_name)
        instance.user.email = user_data.get('email', instance.user.email)
        instance.user.username = instance.username
        new_password = user_data.get('password')
        if new_password:
            instance.user.set_password(new_password)
        instance.user.save()
        instance.save()
        return instance

    class Meta:
        model = Profile
        fields = '__all__'

这里的问题是,当我尝试 DELETE 个人资料时,个人资料将被删除,但用户仍然存在。当发出 DELETE 请求时,我还需要能够删除用户。

我尝试进行一些搜索,但我找不到 destroy 或 delete 的 ModelSerializer 方法。

【问题讨论】:

  • 提及 Django 版本并包含模型

标签: django serialization http-delete


【解决方案1】:

您可以使用perform_destroy 方法在视图级别执行此操作:

class DetailProfile(RetrieveUpdateDestroyAPIView):
    queryset = Profile.objects.all()
    serializer_class = ProfileSerializer
    lookup_field = 'username'
    lookup_url_kwarg = 'username'

    def perform_destroy(self, instance):
        user = instance.user
        instance.delete()
        user.delete()

【讨论】:

  • 这在 Drf 方面是不一致的。在没有销毁操作的情况下,如何在序列化程序中执行更新/创建?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 2015-04-15
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多