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