【问题标题】:Python Django-Rest-Framework update user on data creationPython Django-Rest-Framework 更新用户数据创建
【发布时间】:2023-03-31 03:35:02
【问题描述】:

假设我有 2 个模型,一个用户,另一个帖子。用户可以创建帖子。用户有一个名为“exp_pts”的字段作为 IntegerField。这意味着当用户创建帖子时增加 30。

我假设我必须在 PostSerializer 中使用 create() 方法。这是我当前的 Posts 序列化程序(由于 create() 方法未按预期工作,目前无法正常工作)

class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post
        fields = ('id', 'user', 'kingdom', 'post_type', 'file_path',
                  'title', 'description', 'created_at', 'updated_at')

    def to_representation(self, instance):
        data = super().to_representation(instance)
        data['user'] = SimpleUserSerializer(
            User.objects.get(pk=data['user'])).data
        data['kingdom'] = KingdomSerializer(
            Kingdom.objects.get(pk=data['kingdom'])).data
        return data

    # This is not yet working
    def create(self, validated_data):
        user = validated_data.pop('user')
        user.exp_pts += 30
        user.save()
        return user

有什么方法可以做到以上几点?如果 create() 方法不够用,那么还有什么其他方法可以实现呢?非常感谢任何帮助。谢谢。

【问题讨论】:

    标签: python django django-rest-framework django-serializer


    【解决方案1】:

    您的create 方法错误。应该更像这样:

    def create(self, validated_data):
            user = validated_data.pop('user')
            user.exp_pts += 30
            user.save()
    
            return super().create(validated_data)
    

    您的序列化程序的create 方法必须返回创建的Post 的实例,而不是User。由于实际的创建可以由 DRF 自己处理,直接返回super().create(validated_data)即可。

    【讨论】:

    • 谢谢你的评论,我明白你的意思了,但是这仍然给出这个错误:django.db.utils.IntegrityError: NOT NULL constraint failed: api_post.user_id
    • 啊,您的 post 模型有一个用户 FK。然后不要pop来自字典的用户,而是get它。
    • 用 'get' 代替 'pop' 做到了。谢谢
    猜你喜欢
    • 2020-11-11
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2013-11-15
    • 2019-05-29
    相关资源
    最近更新 更多