CurrentUserDefault не работает с AnonymousUser
Я пытаюсь использовать CurrentUserDefault
с полем, которое может быть null:
# model
class Package(models.Model):
# User can be empty because we allow anonymous donations
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
null=True,
blank=True,
)
# serializer
class PackageSerializer(serializers.ModelSerializer):
owner = serializers.HiddenField(default=serializers.CurrentUserDefault())
Все работает нормально, когда пользователь вошел в систему. Однако если пользователь не аутентифицирован, я получаю следующее:
ValueError at /api/organizations/village/packages/
Cannot assign "<django.contrib.auth.models.AnonymousUser object at 0x7fc97ad6d940>": "Package.owner" must be a "User" instance.
Есть ли причина, по которой CurrentUserDefault
не работает с анонимными пользователями?
P.S. Я знаю, что могу использовать это вместо CurrentUserDefault
и это будет работать:
class AuthorizedUserOrNone:
requires_context = True
def __call__(self, serializer_field):
user = serializer_field.context["request"].user
if user.is_authenticated:
return user
return None
def __repr__(self):
return "%s()" % self.__class__.__name__
Что вы возвращаете, если user.is_anonymous
? Разберитесь с этим и добавьте это в def __call__(self, serializer_field)
, и все будет в порядке. CurrentUserDefault
, похоже, не обрабатывает анонимных пользователей.
Попробуйте:
get_object_or_404(User, fk_user=self.request.user)
В этом ответе содержится более полезный контекст: Django REST Framework - CurrentUserDefault use
Основываясь на том, что я читаю в Traceback, если вы не погрузитесь глубже в кодовую базу класса CurrentUserDefault
, я не думаю, что существует стандартный способ обработки этого. Мои ограниченные исследования показали мне, что CurrentUserDefault
, похоже, не предназначен для обработки анонимных запросов (что вполне подходит, учитывая слово "User" в классе). Traceback, похоже, соответствует этому.
Если я прав, и вы имеете дело с крайним случаем, то, вероятно, потребуется больше модификаций, чтобы достичь того, что вы ищете. Удачи. Извините, что не могу помочь с прямым ответом.
Примечание: вышеизложенное не проверено.