Вернуть поле другой модели в ответ на запрос POST - PullRequest
0 голосов
/ 17 июня 2019

В моем models.py есть две модели:

class Genre(models.Model):
    genre_id = models.CharField(max_length=10)
    name = models.CharField(max_length=40)
    information = models.CharField(max_length=120)

    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    genre = models.ForeignKey(Genre, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

Они сериализованы:

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ('title', 'author', 'genre')


class GenreSerializer(serializers.ModelSerializer):
    class Meta:
        model = Genre
        fields = ('name', 'information')

и ViewSets созданы для каждой:

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer


class GenreViewSet(viewsets.ModelViewSet):
    queryset = Genre.objects.all()
    serializer_class = GenreSerializer

Я хотел бы сделать следующее:

  1. Отправка запроса POST на конечную точку books/.Отправленные данные должны содержать идентификатор существующего жанра, иначе они не будут сохранены в базе данных (это уже сделано по умолчанию).
  2. Получение information от модели Genre в качестве ответа.

Позвольте мне привести короткий пример:

  1. Я отправляю этот JSON:

    { "title": "Hercules Poirot", "author": "Agatha Christie", "genre": 1 }

  2. Вместо повторного запроса сверху я получаю что-то вроде этого:

    { "genre": "crime story" }

Как это сделать?

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Вы можете сказать, как будет работать вложенное поле.Как это:

class GenreSerializer(serializers.ModelSerializer):
    class Meta:
        model = Genre
        fields = ('name', 'information')


class BookSerializer(serializers.ModelSerializer):
    genre = GenreSerializer(read_only=True)

    class Meta:
        model = Book
        fields = ('title', 'author', 'genre')
0 голосов
/ 17 июня 2019

Что вы можете сделать, это добавить собственный метод create в свой BookViewSet для переопределения оператора возврата.

Вы можете воспользоваться примером метода create по умолчанию, который реализован в CreateModelMixin(https://github.com/encode/django-rest-framework/blob/master/rest_framework/mixins.py#L12)

...