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? (Все подробности = Сведения о книге + Производитель_ книги + Редактор + Автор)

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

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

0
Zoro-Zen 25 Сен 2018 в 14:01

2 ответа

Лучший ответ
class BookSimpleSerializer(ModelSerializer):
    class Meta:
        model = Book
        fields = ('author', 'editor', 'book_manufacturer', 'title', 'year')

    def create(self, validated_data):
        return Book(**validated_data)
2
Mohammad Ali 25 Сен 2018 в 11:38

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

Но для создания новой книги вы можете определить метод create в 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
2
Mohammad Ali 25 Сен 2018 в 11:30