У меня очень странная проблема. Я написал промежуточное программное обеспечение, которое исправляет объект запроса с пользовательским свойством. И это отлично работает во всем проекте, кроме 1 действия. Вот они:
Middleware
class AssignSelectedProfileMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
headers = request.META
if not request.user.is_anonymous:
if headers.get(HEADER_PROFILE):
profile = Profile.objects.filter(pk=headers.get(HEADER_PROFILE),
archived=False,
user=request.user).first()
else:
profile = Profile.objects.filter(user=request.user).first()
if not profile:
raise MyProfileAuthorizationError("You are not allowed to use this profile.")
setattr(request, "user", request.user._wrapped)
setattr(request.user, "profile", profile)
response = self.get_response(request)
return response
Действие
@action(
methods=['get', 'patch'],
detail=False,
permission_classes=(IsAuthenticated,),
serializer_class=SafeProfileSerializer,
)
def me(self, request):
return Response(self.get_serializer(self.request.user.profile).data, status.HTTP_200_OK)
Когда я делаю ответ - я вижу, что запрос успешно исправлен в промежуточном программном обеспечении, объект профиля существует, но когда я отлаживаю запрос в представлении - self.request.user.profile
выдает AttributeError: 'User' object has no attribute 'profile'
. Примечание: другие действия в наборе сохранения сохраняются и user.profile
существует. Почему это происходит?
РЕДАКТИРОВАТЬ 1: Печать в промежуточном программном обеспечении и действия:
Middleware: {'_state': <django.db.models.base.ModelState object at 0x7f9e04b04908>, 'id': 1, 'password': 'pbkdf2_sha256$120000$Wxoqm8SATZWk$wVM5uRknaCig+nU7tlY4iQnkwgvJDavdHQHpKBRIstw=', 'last_login': datetime.datetime(2019, 5, 15, 9, 11, 36, 296195), 'is_superuser': False, 'username': 'username0', 'first_name': 'Benjamin', 'last_name': 'Allen', 'email': 'williamsdaniel@hotmail.com', 'is_staff': False, 'is_active': True, 'date_joined': datetime.datetime(2019, 5, 15, 9, 11, 35, 808270), 'profile': <Profile: Benjamin Allen, administrator: False>}
View: {'_state': <django.db.models.base.ModelState object at 0x7f9e04b10358>, 'id': 1, 'password': 'pbkdf2_sha256$120000$Wxoqm8SATZWk$wVM5uRknaCig+nU7tlY4iQnkwgvJDavdHQHpKBRIstw=', 'last_login': datetime.datetime(2019, 5, 15, 9, 11, 36, 296195), 'is_superuser': False, 'username': 'username0', 'first_name': 'Benjamin', 'last_name': 'Allen', 'email': 'williamsdaniel@hotmail.com', 'is_staff': False, 'is_active': True, 'date_joined': datetime.datetime(2019, 5, 15, 9, 11, 35, 808270)}
РЕДАКТИРОВАТЬ 2:
Если я добавлю в промежуточное программное обеспечение что-то вроде этого:
if request.path_info == '/api/users/me/':
setattr(request, "me_action_profile", profile)
И назовите это в действии так:
return Response(self.get_serializer(self.request.me_action_profile).data, status.HTTP_200_OK)
Это работает. Но почему я не могу исправить объект user
в этом конкретном случае?