如何实现Django中子用户编辑父用户的文章对象?
解决方案:支持子用户编辑父用户文章
先修正原有校验逻辑的错误,再新增子用户编辑父文章的权限判断:
原有逻辑的问题
- 错误引用不存在字段:Article模型没有
parent属性,需针对文章的author字段做关联判断 - 自身编辑逻辑错误:
attrs.get('id')取的是文章ID,而非用户ID,应对比文章作者ID与当前用户ID - 缺少子用户编辑父用户文章的判断分支
修正后的序列化器代码
from rest_framework import serializers from rest_framework.exceptions import ValidationError from .models import Article, User class ArticleSerializer(serializers.ModelSerializer): class Meta: model = Article fields = ("id","author","caption","timestamp") def validate(self, attrs): attrs = super().validate(attrs) request_user = self.context['request'].user # 获取文章作者:创建场景从attrs取,更新场景从instance取 article_author = attrs.get('author') or self.instance.author # 情况1:用户编辑自己的文章 if article_author.id == request_user.id: return attrs # 情况2:父用户编辑子用户的文章(文章作者是当前用户的子账号) if article_author.parent_id == request_user.id: return attrs # 情况3:子用户编辑父用户的文章(当前用户的父账号是文章作者) if request_user.parent_id == article_author.id: return attrs raise ValidationError('Unauthorized Request')
逻辑说明
- 兼容创建/更新场景的文章作者获取:创建时从传入的
attrs取author,更新时从已存在的文章instance取author - 三种合法权限分支:
- 用户操作自己的文章,直接通过校验
- 父用户操作子账号的文章(子账号的parent字段指向当前用户),通过校验
- 子用户操作父账号的文章(当前用户的parent字段指向文章作者),通过校验
- 不符合以上场景则抛出权限错误
内容的提问来源于stack exchange,提问作者user14491987
相关产品推荐
相关产品推荐

