Каковы последствия использования request.user вместо self.request.user
Я хочу знать основную разницу между self.request.user
(при использовании generic view View) и request.user
(при использовании user defined view), иногда, когда я использую общий вид django View (django.views.generic import View
), который имеет доступ к модели django User, я взаимодействую с аутентифицированным пользователем как request.user
и self.request.user
без каких-либо проблем.
Например, в django views.py:
from django.contrib.auth import get_user_model
User = get_user_model()
class GetUserView(View):
def get (self, request, *args, **kwargs):
user_qs = User.objects.filter(username=request.user.username)
#Do some other stuffs here
class AnotherGetUserView(View):
def get(self, request, *args, **kwargs):
user_qs = User.objects.filter(username=self.request.user.username)
#Do some other stuffs here
Я понимаю, что два кверисета работают нормально, но я все еще не могу понять, какой лучше использовать.
Нет никакой разницы. Перед запуском метода get
он выполнит метод .setup(…)
[Django-doc], который установит self.request = request
, а также self.args
и self.kwargs
в позиционные и именованные параметры URL соответственно. Если вы не переопределите этот метод, self.request
всегда будет ссылаться на тот же объект, что и request
, и в документации явно сказано, что вы не должны переопределять метод .setup(…)
без вызова метода super, который таким образом установит self.request
.
Однако не имеет особого смысла делать User.objects.filter(username=request.user.username)
: у вас уже есть объект пользователя: это request.user
, поэтому здесь вы только сделаете лишние запросы к базе данных. user_qs
- это просто queryset с одним элементом: request.user
. Таким образом, вы можете, например, использовать request.user.email
для получения адреса электронной почты вошедшего в систему пользователя.
Возможно, вы захотите использовать LoginRequiredMixin
[Django-doc] для обеспечения того, что представление может быть вызвано только если пользователь вошел в систему, так:
from django.contrib.auth.mixins import LoginRequiredMixin
class GetUserView(LoginRequiredMixin, View):
def get (self, request, *args, **kwargs):
# …