七爪源码 如何在 Django Rest Framework 的一个端点中组合两个查询集

从 Django Rest Framework 中的模型返回数据很简单。 为此,我们需要一个 urlpattern、一个视图和一个序列化程序。 但有时,在 DRF 中编写 REST API 时,我们可能希望我们的端点从两个或多个数据库表(模型)返回数据。 最近在我的一个项目中,我有这个任务,现在我将分享我是如何管理它的。

假设我们有两个模型。 项目和新闻:

from operator import modfrom django.db import models# Create your models here.class Project(models.Model):    title = models.CharField(max_length=50)    def __str__(self) -> str:        return self.titleclass News(models.Model):    title = models.CharField(max_length=100)    class Meta:        verbose_name_plural = "News"    def __str__(self) -> str:        return self.title

现在,当然在运行迁移并将更改迁移到数据库之后,我们可以为每个模型创建序列化程序:

from rest_framework import serializersfrom .models import Project, Newsclass ProjectSerializer(serializers.ModelSerializer):    class Meta:        model = Project        fields = '__all__'class NewstSerializer(serializers.ModelSerializer):    class Meta:        model = News        fields = '__all__'

创建视图和 URL 后,我们可以在 DRF Browsable API 中分别查看每个模型的数据:

现在我们想要一个端点同时返回两个查询集。 我们将创建一个新的基于函数的视图来负责运行逻辑。

首先我们应该得到查询集。

 # first we get the querysetsprojects = Project.objects.all()news = News.objects.all()

然后我们应该序列化查询集中的数据。

# then we serialize the dataprojects_serializer = ProjectSerializer(projects, many=True,context{'request': request})news_serializer = NewstSerializer(news, many=True, context={'request': request})data = projects_serializer.data + news_serializer.datareturn Response(data)

这些对象包含序列化数据,因此我们可以通过“object.data”访问数据。

projects_serializer.data 将为我们提供一个列表,其中包含来自数据库的数据作为 OrderedDict。 news_serializer 也是如此。

我们可以添加这两个列表并返回。

我们不能直接返回数据,它应该以 HttpResponse 或 Response 的形式返回。 在 DRF 中,我们使用来自 rest_framework.response 的响应。

我们的完整视图功能将是:

@api_view(['GET'])def projects_and_news(request):    if request.method == 'GET':        # first we get the querysets        projects = Project.objects.all()        news = News.objects.all()        # then we serializer the data        projects_serializer = ProjectSerializer(projects, many=True, context={'request': request})        news_serializer = NewstSerializer(news, many=True, context=  {'request': request})        data = projects_serializer.data + news_serializer.data        return Response(data)

我们可以看到在一个请求中返回了两个数据。

因此,我们实现了通过一个请求/响应从两个不同的数据库表中获取数据。


关注七爪网,获取更多APP/小程序/网站源码资源!

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章