Каковы последствия использования 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):
# …