Python 防止创建/更新引用Django rest框架中禁止对象的外键
让我们假设我有以下模型Python 防止创建/更新引用Django rest框架中禁止对象的外键,python,django,django-rest-framework,Python,Django,Django Rest Framework,让我们假设我有以下模型 class Blog(models.Model): user = models.ForeignKey(User, null=False, on_delete=models.CASCADE) class Post(models.Model): blog = models.ForeignKey(Blog, null=False, on_delete=models.CASCADE) post = models.TextField() 问题是,创建一篇
class Blog(models.Model):
user = models.ForeignKey(User, null=False, on_delete=models.CASCADE)
class Post(models.Model):
blog = models.ForeignKey(Blog, null=False, on_delete=models.CASCADE)
post = models.TextField()
问题是,创建一篇文章可以让我将blog id设置为任何存在的内容。这意味着我能够创建一个Post对象,该对象与用户不“拥有”的Blog
对象有关系
但是,通过过滤查询集并使用check\u object\u permissions
,可以通过GET
方法防止用户访问被禁止的对象。例如:
class PostViewSet(viewsets.ModelViewSet):
serializer = PostSerializer
def get_queryset(self):
return Post.objects.filter(blog__user=self.request.user)
def check_object_permissions(self, request, obj):
if obj.user != request.user:
raise exceptions.PermissionDenied()
super().check_object_permissions(request, obj)
如何解决上述问题并防止在Django REST framework中以最智能/正确的方式创建与禁止对象的关系?如果用户dnt无权访问所选博客,您可以将博客验证添加到序列化程序(检查文档)并引发错误:
class PostSerializer(serializers.ModelSerializer):
...
def validate_blog(self, value):
request = self.context['request']
if value.user != request.user:
raise serializers.ValidationError('Blog id doesn't exist')
return value