Django 只允许与用户数据交互

Django Allow Interaction with Users Data Only

我正在向 Django 应用程序添加一些用户配置文件行为,并且像往常一样我想限制用户只能与他们自己的数据进行交互。此 SO Q&A 与流程本身有关:

将经过身份验证的用户 ID 添加到创建、更新和删除查询中是否足够?为了减少代码重复,我想我可以编写一个 mixin 来覆盖 get_objectget_queryset 并通过添加 self.request.user.pk 来过滤结果来拦截查询?

是否有其他有效的方法来执行此操作,或者 Django 本身的 mixins?

编辑 这就是我的想法:

    class OwnersDataOnlyViewMixin(object):
    def get_object(self, queryset=None):
        if self.model == get_user_model():
            # user model, so pk of model should match self.request.user.pk
            return super().get_object(self.model.objects.filter(pk=self.request.user.pk))
        else:
            # different model
            try:
                # check for the 'user' field and filter on it if found
                user_field = self.model._meta.get_field('user')
                return super().get_object(self.model.objects.filter(user=self.request.user))
            except:
                # Mixin was used with model data not associated with a user
                raise self.model.DoesNotExist      

可能有更灵活的方法来执行此操作,我愿意接受改进建议。

对于基于 class 的视图,您很可能需要重写 get_querset() 方法,因为由它 return 编辑的查询集将用于获取数据以进行编辑和删除,因此 return 类似于 MyModel.objects.filter(owner=self.request.user)。请注意,如果用户试图访问不属于他的对象,这将导致 404 - "Not Found" 响应。

创建新对象时,您主要需要将 request.user 设置为新创建对象的所有者。这可以通过自定义 CreateViewform_valid() 方法来完成:

class MyCreateView(LoginRequiredMixin, generic.CreateView):

    def form_valid(self, form):
        form.instance.owner = self.request.user
        return super().form_valid(form)

根据您的模型结构,您可以将此方法添加到 mixin 中并将它们与通用视图一起使用。