Python 基于 Class 的视图和查询集中 request.user 的 Django 最佳实践
Python Django Best Practice for request.user in Class Based Views and Queryset
我正在使用基于 class 的视图,并且总是遇到同样的问题,但没有完美的解决方案。
我的查询集应该只显示请求用户拥有的查询集。
代码
查看:
class MyListView(ListView):
model = MyModel
def get_queryset(self):
return self.model.objects.owned_by_user(self.user)
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.user = None
def dispatch(self, request, *args, **kwargs):
self.user = request.user
return super().dispatch(request, *args, **kwargs)
型号:
class MyModelQuerySet(models.QuerySet):
def owned_by_user(self, user):
return self.filter(user_field=user)
class MyModelManager(models.Manager):
def get_queryset(self):
return MyModelQuerySet(self.model, using=self._db)
def owned_by_user(self, user):
return self.get_queryset().owned_by_user(user)
class MyModel(models.Model):
user_field = ...
objects = ProductRequestManager()
最佳实践 1:
我想我必须覆盖 dispatch 才能添加 request.user。
我的 IDE 注释“实例属性用户在 init 之外定义。为了防止这种情况,我还需要覆盖 init()。我怎样才能用更少的代码实现这一目标?
最佳实践 2:
有没有其他方法可以获取属于当前用户的查询集?
您只需使用 self.request.user
过滤查询集。请注意,setup()
方法会将值分配给 self.request
、self.args
和 self.kwargs
:
class MyListView(ListView):
model = MyModel
def get_queryset(self):
return self.model.objects.owned_by_user(<b>self.request.user</b>)
Note: You can limit views to a class-based view to authenticated users with the
LoginRequiredMixin
mixin [Django-doc].
我正在使用基于 class 的视图,并且总是遇到同样的问题,但没有完美的解决方案。 我的查询集应该只显示请求用户拥有的查询集。
代码
查看:
class MyListView(ListView):
model = MyModel
def get_queryset(self):
return self.model.objects.owned_by_user(self.user)
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.user = None
def dispatch(self, request, *args, **kwargs):
self.user = request.user
return super().dispatch(request, *args, **kwargs)
型号:
class MyModelQuerySet(models.QuerySet):
def owned_by_user(self, user):
return self.filter(user_field=user)
class MyModelManager(models.Manager):
def get_queryset(self):
return MyModelQuerySet(self.model, using=self._db)
def owned_by_user(self, user):
return self.get_queryset().owned_by_user(user)
class MyModel(models.Model):
user_field = ...
objects = ProductRequestManager()
最佳实践 1:
我想我必须覆盖 dispatch 才能添加 request.user。 我的 IDE 注释“实例属性用户在 init 之外定义。为了防止这种情况,我还需要覆盖 init()。我怎样才能用更少的代码实现这一目标?
最佳实践 2:
有没有其他方法可以获取属于当前用户的查询集?
您只需使用 self.request.user
过滤查询集。请注意,setup()
方法会将值分配给 self.request
、self.args
和 self.kwargs
:
class MyListView(ListView):
model = MyModel
def get_queryset(self):
return self.model.objects.owned_by_user(<b>self.request.user</b>)
Note: You can limit views to a class-based view to authenticated users with the
LoginRequiredMixin
mixin [Django-doc].