DRF中相关模型之间许可的继承



我有3种型号,例如Bellow:

class CustomUser(AbstractUser):
    pass

class PropertyPost(models.Model):
    owner = models.ForeignKey(
        get_user_model(),
        related_name='posts4thisowner',
        on_delete=models.CASCADE)

class Image(models.Model):
    prop_post = models.ForeignKey(
        PropertyPost,
        related_name='images4thisproperty',
        on_delete=models.CASCADE)

这里的想法是用户可以发布许多propertypost,并且每个propertypost都可以具有许多图像。

事情正常。我的问题是允许的。我设置了一组权限,如下所示,我的propertypostdetail视图未经许可:

class PropertyPostDetail(generics.RetrieveUpdateDestroyAPIView):
 ...
    permission_classes = (
        permissions.IsAuthenticatedOrReadOnly,
        custompermission.IsCurrentUserOwnerOrReadOnly,
        )
class ImageList(generics.ListCreateAPIView):
    queryset = Image.objects.all()
    serializer_class = ImageSerializer
    name = 'image-list'
class ImageDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Image.objects.all()
    serializer_class = ImageSerializer
    name = 'image-detail'

我的意思是只有帖子所有者才能弄乱其帖子。

现在,因为图像模型是针对属性托管的,所以我期望此权限也将其保留到图像中。但是,显然,任何用户都可以编辑任何图像,这显然是一个缺陷。我的问题是如何将图像视图设置为继承其父母的权限。

好的,所以很希望有更轻松的解决方案,但是这就是我如何解决的方法。我在这里尝试不是为图像模型创建所有者,因为Image Model具有PropertyPost作为其父属于所有者的父。因此,图像应继承该所有者:

class Image(models.Model):
    prop_post = models.ForeignKey(
        PropertyPost,
        related_name='images4thisproperty',
        on_delete=models.CASCADE)
    prop_post_owner=models.CharField(max_length=150,null=True,blank=True)

这将是序列化器:

class ImageSerializer(serializers.HyperlinkedModelSerializer):
    prop_post = serializers.SlugRelatedField(queryset=PropertyPost.objects.all(),
                                             slug_field='pk')
    prop_post_owner = serializers.ReadOnlyField(source='prop_post.owner.username')
    class Meta:
        model = Image
        fields = (
            'pk',
            'url',
            'prop_post',
            'prop_post_owner'
       )

以这种方式,我的图像模型具有从PropertyPost开始的所有者。

现在,在列表级别用户可以创建一个对象,并且由于不清楚用户将要选择哪个对象,因此CustomPermisiss将会失败。最后,这就是我阻止非所有者为属性创建图像字段的方式:

class ImageList(generics.ListCreateAPIView):
    queryset = Image.objects.all()
    serializer_class = ImageSerializer
    name = 'image-list'
    ....
    def perform_create(self, serializer):
        obj=PropertyPost.objects.get(pk=int(self.request.data['prop_post']))
        if self.request.user!=obj.owner:
            raise ValidationError('you are not the owner')
        serializer.save(prop_post_owner=self.request.user)

最新更新