Никакой посторонний ключ не связан с validated_data в Django - PullRequest
0 голосов
/ 14 февраля 2020

Привет. Я хочу отправить сообщение в мой альбом с помощью моего AlbumSerializer. Проблема в том, что я не получаю имя Исполнителя в проверенных данных внутри функции create.

#models.py
class Artist(models.Model):
    name = models.CharField()
    ...

class Album(models.Model):
    name = models.CharField()
    artist = models.ForeignKey(Artist)

class Track(models.Model):
    album = models.ForeignKey(Album)
    title = models.CharField()

#serializers.py
class AlbumSerializer(serializers.ModelSerializer):
    artist = serializers.StringRelatedField()
    tracks = TrackSerializer(many=True)

    class Meta:
        model = Album
        fields = '__all__'

    def create(self, validated_data):
        print(validated_data)
        ...

Я передаю эти данные:

{
    "name": "Test",
    "artist": "Enimem",
    ...
}

Когда я печатаю validated_data Художник не включен. Это потому, что это внешний ключ? Тогда как мне добавить его в validated_data?

{'name': 'Test', ...}

Я попытался добавить функцию to_interval_value, которая разрешила мою проблему, но я действительно не хочу, чтобы она была добавлена, потому что она испортила стандартные ошибки ValidationErrors.

def to_interval_value(self, data):
    return data

1 Ответ

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

Дело в том, что StringRelatedField использует метод __str__, как указано здесь и , что наиболее важно, он только для чтения , вот почему.

Вы хотите сделать его доступным для чтения-записи, поскольку read_only означает, что он будет использоваться для отображения, но игнорируется в качестве ввода при выполнении POSTing (см. Здесь https://www.django-rest-framework.org/api-guide/fields/#read_only).

Я думаю, что вы хотите использовать чтение-запись SlugRelatedField с указанием slug_field='name' и queryset=Artist.objects.all():

artist = serializers.SlugRelatedField(slug_field='name', queryset=Artist.objects.all())

Посмотрите документы здесь для получения дополнительной информации об этом.

Обратите внимание, что поле должно быть уникальным.

...