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, похоже, соответствует этому.

Если я прав, и вы имеете дело с крайним случаем, то, вероятно, потребуется больше модификаций, чтобы достичь того, что вы ищете. Удачи. Извините, что не могу помочь с прямым ответом.

Примечание: вышеизложенное не проверено.

См: Джанго REST документация

Вернуться на верх