【问题标题】:Return nested JSON from Models with relations in Django从模型中返回嵌套的 JSON 与 Django 中的关系
【发布时间】:2021-02-27 19:07:21
【问题描述】:

models.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 的字符串表示形式(当然),我如何使值成为Book 的序列化实例?我创建了一个BookSerializer注意事项: 我知道我可以通过使用depth = 2Paragraph 创建一个序列化程序来创建一个嵌套的json,但这将包括我不想要的字段(如Book 中的pages),并且json 结构将完全不同。

【问题讨论】:

    标签: json django serialization


    【解决方案1】:

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

    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']

    【讨论】:

    • 这很完美,但我不明白 source="paragraph_set" 的来源,我在其他框架文档中找不到它,你能解释或链接引用它的文档吗?谢谢你,我很感激。
    • 这里是 DRF source@JLeno46 的参考文献
    猜你喜欢
    • 1970-01-01
    • 2017-11-23
    • 2022-08-05
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多