json - 从模型中返回嵌套的 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
.
注意:
我知道我可以通过为Paragraph
with创建一个序列化程序来创建一个嵌套的 json,depth = 2
但这将包括我不想要的字段(如pages
in Book
),并且 json 结构将完全不同。
解决方案
您可以将嵌套序列化程序创建为
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']
推荐阅读
- python - 如何使用组合框 PYQT5 的列表
- c - 如何在函数中使用 realloc() 并访问值?
- mongodb - Mongo访问数据库用户权限
- google-cloud-bigtable - BigTable 数据加载模式优化
- angular - 比较和替换表格行中的数据
- javascript - 在夏季注释中加载数据时 JS 弹出 Unexpected Identifier 的错误
- javascript - 回发后Javascript标签失去价值
- r - 基于子集值的ggplot
- c++ - 将一对向量放入 unordered_map 与地图
- postgresql - SQL 需要很长时间才能执行