Пользователь Api Post всегда имеет значение null, хотя вошел в систему пользователь - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь получить API для моего приложения ответов. Когда сообщение создается, пользователь всегда имеет значение NULL. Я не уверен, почему это так.

Как автоматически добавить в сохраняемый объект некоторые поля, такие как аутентифицированный пользователь, IP-адрес пользователя?

Вот мой сериализатор:

User = get_user_model()

class UserPublicSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = [
            'username',
            'first_name',
            'last_name',
            'is_staff',
            'photo_url'
        ]
class AnswerCreateUpdateSerializer(ModelSerializer):
    user = UserPublicSerializer(read_only=True)
    class Meta:
        model = Answer
        fields = [
            'object_pk',
            'content_type',
            'answer',
            'user'
        ]
        read_only_fields = ['user']

И представление API создает:

class AnswerCreateAPIView(CreateAPIView):
    queryset = Answer.objects.all()
    serializer_class = AnswerCreateUpdateSerializer

И модель:

class AnswerAbstractModel(BaseAnswerAbstractModel):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('user'),
                             blank=True, null=True, related_name="%(class)s_answers",
                             on_delete=models.SET_NULL)
    answer = FroalaField()
    submit_date = models.DateTimeField(_('date/time submitted'), default=None, db_index=True)
    ip_address = models.GenericIPAddressField(_('IP address'), unpack_ipv4=True, blank=True, null=True)


class Answer(AnswerAbstractModel):
    class Meta(AnswerAbstractModel.Meta):
        db_table = "answers"

Прошу прощения за мое невежество в мире django. Хотя я изо всех сил пытаюсь понять это.

Тем не менее, какой подход должен быть здесь?

1 Ответ

1 голос
/ 17 февраля 2020

Вы должны переопределить perform_create() метод AnswerCreateAPIView, как показано ниже,

class AnswerCreateAPIView(CreateAPIView):
    queryset = Answer.objects.all()
    serializer_class = AnswerCreateUpdateSerializer

    <b>def perform_create(self, serializer):
        serializer.save(user=self.request.user)</b>

Update-1

Зачем вам нужно переопределить?

Case-1

Вы задали user как read_only_field в вашем AnswerCreateUpdateSerializer. При этом DRF serialzier не будет извлекать любые входные данные из полезной нагрузки JSON, даже если данные присутствуют в ней

Case-2

Если вы сбросили свойство read_only, DRF попросит вас предоставить dict подобный объект для user поскольку у вас есть вложенный сериализатор конфигурация.

Путь DRF

Если вы хотите сохранить logged- в пользовательском к БД в DRF вы должны установить для поля user значение read_only и переопределить соответствующие методы и получить зарегистрированного пользователя из объект запроса.

...