首页 > 解决方案 > 从模型中返回嵌套的 JSON 与 Django 中的关系

问题描述

模型.py(简化)

class Author(models.Model):

    name = models.CharField(max_length=255)
    
    def __str__(self):
        return self.name

    def get_books(self):
        return Book.objects.filter(author=self.pk)


class Book(models.Model):

    name = models.CharField(max_length=255)
    pages = models.IntegerField()
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.name} from {self.author}'


class Paragraph(models.Model):

    name = models.CharField(max_length=255)
    book = models.ForeignKey(Book, on_delete=models.CASCADE)


    def __str__(self):
        return f'{self.name} from {self.book}'

我想用这个结构返回一个 json 文件中的所有实例:

[
    {
        "name": 'Dumas', 
        "books": {
            "name": "The count of Montecristo",
            "paragraphs": {
                "name": "paragraph_name_1",
                         },
                          {
                "name": "paragraph_name_2",
                         },
                 {
            "name": "The three Musketeers",
            "paragraphs": {
                "name": "paragraph_name",
                         },
]

我试过的: serializers.py

class AuthorSerializer(serializers.ModelSerializer):

    books = serializers.CharField(source='get_books', read_only=True)

    class Meta:
        model = Author
        fields = ['name', 'books']

这添加了books键,但值是Book(当然) istances 的字符串表示,我如何使值成为序列化的 istances Book?我创建了一个BookSerializer. 注意: 我知道我可以通过为Paragraphwith创建一个序列化程序来创建一个嵌套的 json,depth = 2但这将包括我不想要的字段(如pagesin Book),并且 json 结构将完全不同。

标签: jsondjangoserialization

解决方案


您可以将嵌套序列化程序创建为

class ParagraphSerializer(serializers.ModelSerializer):
    class Meta:
        model = Paragraph
        fields = ("name",)


class BookSerializer(serializers.ModelSerializer):
    paragraphs = ParagraphSerializer(source="paragraph_set", many=True, read_only=True)

    class Meta:
        model = Book
        fields = ("name", "paragraphs")


class AuthorSerializer(serializers.ModelSerializer):
    books = BookSerializer(source="book_set", read_only=True, many=True)

    class Meta:
        model = Author
        fields = ['name', 'books']

推荐阅读