Вложенный сериализатор с 3 внешними ключами.Как реализовать GET и POST? - PullRequest
0 голосов
/ 25 сентября 2018
class Author(models.Model):

   first_name = models.CharField(max_length=255)

   last_name = models.CharField(max_length=255)

   age = models.IntegerField()

//

class Editor(models.Model):

   first_name = models.CharField(max_length=255)

   date_edition = models.DateTimeField(default=datetime.now)

   status = models.BooleaField(default=True)

//

class Book_Manufacturer(models.Model):

   name = models.CharField(max_length=255)

   year_production = models.DateTimeField(default=datetime.now)

//

class Book(models.Model):

   author = models.models.ForeignKey(Author, on_delete=models.CASCADE)

   editor = models.models.ForeignKey(Editor, on_delete=models.CASCADE)

   book_manufacturer = models.models.ForeignKey(Book_Manufacturer, on_delete=models.CASCADE)

   title = models.CharField(max_length=255)

   year = models.DateTime(default=datetime.now)

Кто-нибудь может мне помочь?Как я мог бы сериализовать книгу с 3 foreign_key и показать все детали, когда у меня есть метод GET?(Все детали = Детали книги + Book_Manufacturer + Редактор + Автор)

А как насчет метода POST, как он будет реализован, если я хочу создать Книгу со всей информацией?

PSВ реальном приложении у меня есть модель с 3 внешними ключами, как в примере.Я использовал здесь пример с наивным подходом, это не мои реальные поля модели и имена классов XD, это просто пример.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018
class BookSimpleSerializer(ModelSerializer):
    class Meta:
        model = Book
        fields = ('author', 'editor', 'book_manufacturer', 'title', 'year')

    def create(self, validated_data):
        return Book(**validated_data)
0 голосов
/ 25 сентября 2018

вы можете определить сериализатор следующим образом:

Но для создания новой книги вы можете определить метод создания в BookSerializer и создать там все новые объекты

class AuthorSerializer(ModelSerializer):
    class Meta:
        model = Author
        fields = ('first_name', 'last_name', 'age')

class EditorSerializer(ModelSerializer):
    class Meta:
        model = Editor
        fields = ('first_name', 'date_edition', 'status')

class Book_ManufacturerSerializer(ModelSerializer):
    class Meta:
        model = Book_Manufacturer
        fields = ('name', 'year_production')


class BookSerializer(ModelSerializer):

    author = AuthorSerializer()
    editor = EditorSerializer()
    book_manufacturer = Book_ManufacturerSerializer()

    class Meta:
        model = Book
        fields = ('author', 'editor', 'book_manufacturer', 'title', 'year')
   def create(self, validated_data):
       author = validated_data.pop('author')
       editor = validated_data.pop('editor')
       book_manufacturer = validated_data.pop('book_manufacturer')

       author_obj = Author.objects.create(first_name=author['first_name'], last_name=author['last_name'])

       # do it for editor and book_manufacturer
       book = Book.objects.create(author=author_obj, editor=editor_obj, book_manufacturer=book_manufacturer_obj, title=validated_data['title'], year=validated_data['year'])

       return validated_data
...