Size: a a a

2021 July 30

Т

Тиипжан in Python KZ
Всё же хранится в request.data
источник

Т

Тиипжан in Python KZ
вся инфа о запросе и юзере
источник

L

Leo in Python KZ
я бы это всё в сериализаторе сделал

class AnswerSerializer(serializers.ModelSerializer):
   user = serializers.HiddenField(default=serializers.CurrentUserDefault())
источник

A

Azamat in Python KZ
сейчас про это сильно не парься, но вообще у тебя ненормализованная база данных и это нехорошо.

у тебя юзернейм хранится в двух таблицах - User и Answer - это нарушает вторую нормальную форму.

может привести к несовпадению данных. что если юзернейм в User поменяют, у тебя в Answer останется старый
источник

L

Leo in Python KZ
дело в том, что в DRF происходит передача request'а в контекст сериализатора (вы можете посмотреть как реализован метод get_serializer_context()) в классе ModelViewSet

и если вы хотите, чтобы поле модели, ссылающееся на модель User автоматически заполнялось request.user'ом, то вы можете сделать это как указано в моём примере выше. Из преимуществ отмечу то, что вам не надо будет переопределять метод create()
источник

AK

Alibek Kaparov in Python KZ
Лучше property-функцию сделай, который по UUID будет искать юзера и выдавать юзернейм.
источник

Т

Тиипжан in Python KZ
Я б тоже так сделал, если б шарил хорошо.
источник

Т

Тиипжан in Python KZ
но нам новичкам не легко.
источник

L

Leo in Python KZ
Поэтому, пожалуй, лучше в таблицу сохранять не имя пользователя, а его идентификатор
источник

L

Leo in Python KZ
Ну так попробуйте просто скопировав код выше
источник

Т

Тиипжан in Python KZ
Так это надо создавать serializers.CurrentUserDefault()
источник

Т

Тиипжан in Python KZ
А как он будет работать
источник

L

Leo in Python KZ
нет, это уже есть в django-rest-framework - не надо ничего создавать
источник

Т

Тиипжан in Python KZ
Ааааа тогда круто, сейчас попробую
источник

L

Leo in Python KZ
class CurrentUserDefault:
   requires_context = True

   def __call__(self, serializer_field):
       return serializer_field.context['request'].user

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


Он вытаскивает пользователя из контекста, переданного ему.
А контекст передаётся сериализатору

    def get_serializer(self, *args, **kwargs):
       """
       Return the serializer instance that should be used for validating and
       deserializing input, and for serializing output.
       """
       serializer_class = self.get_serializer_class()
       kwargs.setdefault('context', self.get_serializer_context())
       return serializer_class(*args, **kwargs)
источник

L

Leo in Python KZ
По умолчанию в контексте содержатся три поля - request, format, view

    def get_serializer_context(self):
       """
       Extra context provided to the serializer class.
       """
       return {
           'request': self.request,
           'format': self.format_kwarg,
           'view': self
       }
источник

L

Leo in Python KZ
если метод get_serializer_context переопределить, то можно что-нибудь ещё добавить
источник

L

Leo in Python KZ
хотя через request и view можно добраться много до чего, что касается непосредственно запроса
источник

Т

Тиипжан in Python KZ
А если вписать так user = models.CharField(max_length=100, default=serializers.CurrentUserDefault(), editable=False)
источник

АА

Алихан Амандык... in Python KZ
Ага, бот не сработал
источник