📜  在 django rest 框架中获取 id 的完整详细信息多对多 - Python (1)

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

在 Django REST 框架中获取 id 的完整详细信息多对多 - Python

在 Django REST 框架中,多对多(ManyToManyField)关系指的是一个数据库模型中的一个字段,它可以引用同一个模型中的其它对象。这个字段通过一个中间表来实现,中间表中包含了前面两个模型的唯一标识符,它们可以是任意的有效字符串或整数值。

但是,在 REST 框架中,获取多对多关系的完整详细信息似乎并不是很容易。本文将介绍如何在 Django REST 框架中获取多对多关系中每个对象的完整详细信息。

简单示例

首先,让我们来看一个简单的例子,假设我们有两个模型AuthorBook,它们之间是一个多对多关系。我们假设已经有了几个作者和他们的书籍,我们想获取每个作者的所有书籍。

我们可以定义以下模型:

class Author(models.Model):
    name = models.CharField(max_length=100)
    
class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)

然后,我们可以在serializers.py文件中创建序列化器,并指定authors字段的关联模型:

class BookSerializer(serializers.ModelSerializer):
    authors = AuthorSerializer(read_only=True, many=True)

    class Meta:
        model = Book
        fields = ['id', 'title', 'authors']

最后,我们可以定义相应的视图来获取书籍和作者信息:

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

这个简单的例子将返回每个作者的名称和他们的书籍。

获取详细信息

但是,上面的例子只返回了每个作者的名称,我们如何获取完整的作者详细信息?

方法是使用另一个序列化器来序列化作者对象:

class AuthorDetailsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = ['id', 'name', 'email', 'phone']

class BookSerializer(serializers.ModelSerializer):
    authors = AuthorDetailsSerializer(many=True)

    class Meta:
        model = Book
        fields = ['id', 'title', 'authors']

AuthorDetailsSerializer中,我们返回了所有相关的作者详细信息,包括email和phone。然后,在BookSerializer中,我们使用AuthorDetailsSerializer序列化器来序列化authors字段。

现在,当我们检索书籍时,我们将获得每个作者的所有详细信息。

结论

通过使用一个额外的序列化器,我们可以轻松地在 Django REST 框架中获取多对多关系中每个对象的完整详细信息。这种方法也适用于其他一些复杂的嵌套关系场景。