Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 防止创建/更新引用Django rest框架中禁止对象的外键_Python_Django_Django Rest Framework - Fatal编程技术网

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