限制对Django中对象的访问

时间:2019-09-21 10:36:22

标签: django django-models

我有一个特定的模型,该模型具有细粒度的访问设置。像这样:

class Document(models.Model):
    ...
    access = models.ManyToManyField(Group)

组由特定标签组成,这些标签链接到用户。长话短说,文档只能由特定用户访问。重要的是,该检查不要滑过裂缝。所以我可以看到很多选择。一种是,每次访问文档时,我都会添加支票:

  

Document.objects.filter(access__group__tag__user = request.user)

但是有两个缺点:a)我在视图中查询文档模型> 100次,因此我将有很多重复的代码,并且b)很有可能有人会忘记在此添加此限制,使文档暴露在外。

因此,我认为通过自定义管理器覆盖object()最有意义。这样,我就不会重复代码,也不会冒险忘记这样做。

class HasAccessManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(access__group__tag__user=request.user)

class Document(models.Model):
    ...
    access = models.ManyToManyField(Group)
    objects = HasAccessManager()

但是,问题在于该请求无法在其中访问:

  

未定义名称“ request”

该如何解决?还是有更好的解决方案?

1 个答案:

答案 0 :(得分:0)

创建一个您的视图继承的混合。这样可以防止到处都有重复的代码。您需要编写单元测试,以确保适当地锁定了视图。

class HasAccessMixin(object):
    def get_queryset(self):
        qs = super().get_queryset()

        # you can still leverage a custom model manager here if you want
        # qs = qs.custom_method(access__group__tag__user=self.request.user)

        qs = queryset.filter(access__group__tag__user=self.request.user)
        return qs

class SomeListView(HasAccessMixin, ListView):
    ...

class SomeDetailView(HasAccessMixin, DetailView):
    ...
相关问题