我有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)