Django | Сериализатор для внешних ключей

У меня есть две модели Book и Author, реализованные следующим образом:

class Author(models.Model):
    name = models.CharField(max_length=50)

class Book(models.Model):
    name = models.CharField(max_length=50)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

В дополнение к этому я получил следующие сериализаторы:

class AuthorSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(max_length=50)

class BookSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(max_length=50)
    author = AuthorSerializer()

Сериализация объектов работает без проблем.

Теперь у меня следующая ситуация:

Авторские:

id name
1 Josh Robert
2 J. R. R. Tolkien
3 Mike Towers

Я получаю POST запрос к конечной точке API на моем сервере

http://127.0..0.1:8000/api/book

выглядит следующим образом:

payload = {
'name': 'Lord of the rings',
'author': 2
}

Как я могу использовать мои сериализаторы для создания новой книги с заданным именем и связать ее с автором no. 2?

Вы можете добавить поле user_id для записи в BookSerializer. Кстати, вам не нужно задавать поле id. Django автоматически разберется с полем id, если вы выводите его из serializers.ModelSerializer.

class AuthorSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length=50)

    class Meta:
        fields = '__all__'
        Model = Author

class BookSerializer(serializers.ModelSerializer):
    author_id = serializers.IntegerField(write_only=True)
    name = serializers.CharField(max_length=50)
    author = AuthorSerializer(read_only = True)

    class Meta:
        fields = ('id', 'name', 'author', 'author_id',)
        Model = Book

А во фронтенде полезная нагрузка должна быть

{
    'name': 'Lord of the rings',
    'author_id': 2
}
Вернуться на верх