📜  序列化嵌套对象 drf,django restframework 嵌套对象序列化 - Python (1)

📅  最后修改于: 2023-12-03 14:54:09.073000             🧑  作者: Mango

序列化嵌套对象 drf,django restframework 嵌套对象序列化

在使用Django Rest Framework (DRF) 进行数据序列化时,嵌套对象的序列化是一个很常见的需求。本文将介绍如何实现 DRF 中嵌套对象的序列化。

简单嵌套对象的序列化

我们可以通过使用 DRF 中的 Serializer 类来实现嵌套对象的序列化。

假设我们有以下的模型类:

class Book(models.Model):
    title = models.CharField(max_length=100)

class Author(models.Model):
    name = models.CharField(max_length=50)
    books = models.ManyToManyField(Book)

需要将 Author 对象序列化为 JSON,同时包含该作者的所有书籍信息。我们可以使用 DRF 提供的 serializers.ModelSerializer 来实现这个功能:

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

class AuthorSerializer(serializers.ModelSerializer):
    books = BookSerializer(many=True)
    class Meta:
        model = Author
        fields = ('name', 'books')

在上面的例子中,我们创建了两个 Serializer 类,分别用于序列化 Book 和 Author 两个模型类。在 AuthorSerializer 中,我们使用了 BookSerializer 类来序列化 books 字段。通过将 many=True 传递给 BookSerializer 类,我们告诉 DRF books 字段包含多个 Book 对象。

现在我们可以通过以下代码将 Author 对象序列化为 JSON:

author = Author.objects.first()
serializer = AuthorSerializer(author)
json_data = JSONRenderer().render(serializer.data)

序列化结果如下:

{
    "name": "Jack",
    "books": [
        {
            "id": 1,
            "title": "Python"
        },
        {
            "id": 2,
            "title": "Django"
        }
    ]
}
深度嵌套对象的序列化

当对象之间嵌套得更深时,序列化会变得更加复杂。考虑以下的模型类:

class Book(models.Model):
    title = models.CharField(max_length=100)

class Publisher(models.Model):
    name = models.CharField(max_length=50)

class Author(models.Model):
    name = models.CharField(max_length=50)
    books = models.ManyToManyField(Book)
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)

需要将 Author 对象序列化为 JSON,但是需要包含该作者的所有书籍、书籍所属的出版社信息。对于这种情况,我们可以使用嵌套 Serializer 来序列化出版社对象:

class PublisherSerializer(serializers.ModelSerializer):
    class Meta:
        model = Publisher
        fields = '__all__'

class BookSerializer(serializers.ModelSerializer):
    publisher = PublisherSerializer()
    class Meta:
        model = Book
        fields = ('id', 'title', 'publisher')

class AuthorSerializer(serializers.ModelSerializer):
    books = BookSerializer(many=True)
    class Meta:
        model = Author
        fields = ('name', 'books')

在上面的例子中,我们新增了一个 PublisherSerializer 来序列化 Publisher 对象。在 BookSerializer 中,我们使用了 PublisherSerializer 类来序列化 publisher 字段。在 AuthorSerializer 中,我们仍然使用 BookSerializer 类来序列化 books 字段。

现在我们可以通过以下代码将 Author 对象序列化为 JSON:

author = Author.objects.first()
serializer = AuthorSerializer(author)
json_data = JSONRenderer().render(serializer.data)

序列化结果如下:

{
    "name": "Jack",
    "books": [
        {
            "id": 1,
            "title": "Python",
            "publisher": {
                "id": 1,
                "name": "O'Reilly"
            }
        },
        {
            "id": 2,
            "title": "Django",
            "publisher": {
                "id": 2,
                "name": "Packt"
            }
        }
    ]
}
总结

在使用 DRF 进行数据序列化时,嵌套对象的序列化是一个非常常见的需求。通过使用嵌套 Serializer 类,我们可以轻松地实现深度嵌套对象的序列化。