DRF: странное поведение при сериализации с использованием «источника» в поле - PullRequest
0 голосов
/ 26 апреля 2019

модель:

class Profile(models.Model):
    user       = models.ForeignKey(User)
    occupation = models.CharField()

сериализатор:

class ProfileSerializer(serializers.ModelSerializer):
    user_id         = serializers.UUIDField(source="user.id")
    user_email      = serializers.EmailField(source="user.email", read_only=True)
    user            = serializers.UserSerializer(read_only=True)

    class Meta:
        model = Profile

Работает нормально, как и ожидалось, когда я нажал на API с действием retrieve, т.е. /profiles/1/

пример ответа:

{
    "user_id": "user_1",
    "user_email": "human@earth.com",
    "occupation": "software engineer",
    "user": {
         "id": "user_1", "first_name": "", ....
    }
}

, но когда я пытаюсь создать ресурс, предоставив следующие данные:

{
    "user_id": "user_2",
    "occupation": "network engineer"
}

поле user_id становится таким {"user": {"uuid": "requested_user_id"}} на стороне серверанапример:

{
    "user": {
        "uuid": "user_2"
    },
    "occupation": "network engineer",
}

вместо

{
    "user_id": "user_2",
    "occupation": "network engineer",
}

Я отладил это, зарегистрировав serializer.validated_data.

Это желаемое поведение или нет, с точки зрения DRFПосмотреть?Есть ли простой способ предотвратить это?(например, дополнительные аргументы в полях, которые не изменяют исходное определенное имя поля)

Я смотрел на основные аргументы в документации, но не нашел ничего полезного.

Я просто хочу нацелиться на действие user_id in create в наборе.

Спасибо.

1 Ответ

0 голосов
/ 27 апреля 2019

Измените ваш сериализатор, как показано ниже,

class ProfileSerializer(serializers.ModelSerializer):
    user_id = serializers.UUIDField(source="user.id", <b>read_only=True</b>)
    user_email = serializers.EmailField(source="user.email", read_only=True)

    class Meta:
        model = Profile
        <b>fields = '__all__'
        extra_kwargs = {
            'user': {'write_only': True},
        }</b>

и измените полезную нагрузку создания как,

{
    "user": 1,
    "occupation": "network engineer"
}

Где "1" - это значение PK объекта User в БД.

...