DRF: путь в поле UserProfile по умолчанию в сериализаторе?

100
16

Использование текущей модели пользователя в ваших сериализаторах легко:

user = serializers.PrimaryKeyRelatedField(
read_only=True,
default=serializers.CurrentUserDefault()
)

но что, если у меня есть моя собственная модель UserProfile, и я хочу использовать текущий UserProfile в сериализаторе. Просто делать CurrentUserDefault().profile не работает, потому что на данный момент это пустой объект.

спросил(а) 2021-01-25T16:31:24+03:00 4 месяца, 2 недели назад
1
Решение
98

Оказывается, эта проблема очень легко решена. Если вы посмотрите на исходный код класса CurrentUserDefault, вы увидите, что это очень просто:

class CurrentUserDefault(object):
def set_context(self, serializer_field):
self.user = serializer_field.context['request'].user

def __call__(self):
return self.user

def __repr__(self):
return unicode_to_repr('%s()' % self.__class__.__name__)

Я предполагаю, что set_context вызывается Serializer, а затем метод __call__ вызываемый для получения объекта. Поэтому очень просто переписать этот код любым способом.

TL;DR

Просто добавьте это где-нибудь:

class CurrentUserProfileDefault(serializers.CurrentUserDefault):
def __call__(self):
return self.user.userprofile

И где вам нужен ваш профиль, просто напишите:

user_profile = serializers.PrimaryKeyRelatedField(
read_only=True,
default=serializers.CurrentUserProfileDefault()
)

ответил(а) 2021-01-25T16:31:24+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема