gpt4 book ai didi

Django REST 框架 - 根据请求提供常规网页和 API 响应的 View

转载 作者:行者123 更新时间:2023-12-01 10:32:32 24 4
gpt4 key购买 nike

我正在使用 Django REST 框架编写一个网站。这是我与 REST 的第一天,所以请多多包涵。基本上,问题是,

  1. 我能否想出一个基于类的 View ,既可以作为 Android 开发人员的 API(带有 JSON 响应)又可以作为 View 呈现常规 Django 模板?或者我必须为此目的定义两个不同的 View ?
  2. 如果问题 1 的答案是我必须定义两个单独的 View ,那么考虑到查询集是相同的,最 DRY 的方法是什么?

View :

class TestList(APIView):
renderer_classes = [TemplateHTMLRenderer]
template_name = 'android/test.html'

def get(self, request):
queryset = Test.objects.all()
return Response({'test_qs': queryset})

换句话说,假设我有一个模型查询集,我想在我的网站上将其呈现给我的最终用户,并将其发送给我的 Android 开发人员。就 REST 框架代码架构而言,最佳实践是什么?两种不同的基于类的 View ?还是一个 View 里面有两种方法?还是一种 View 和一种魔术方法可以为我完成这两项工作?

最佳答案

我建议将其分开。使用简单的 CRUD - 你不会遇到 DRY 的问题,因为它们只是不同的 View ,考虑:

DRF(基本上这都是为了 CRUD,如果你只想要一个列表使用:ListModelMixin):

class ServiceViewSet(viewsets.ModelViewSet):
queryset = Service.objects.all()
serializer_class = ServiceSerializer

我认为将其合并为一个 View - 迟早会给您带来麻烦。

什么样的麻烦?

  • 您的模板在某些时候可以使用比 REST API 多得多的数据向用户显示页面(简单示例:当前时间)- 您将开始为模板实现不同的上下文,为 REST 实现不同的上下文;
  • 我想不出更多 ;) 但我有一种感觉,两个独立的 View 使它更清晰。

我也理解重复相同代码两次的风险 - 但您始终可以将重复代码提取到一些帮助结构中。

至于查询集 - 如果它很简单 - 不要为存储它而烦恼。如果它变得复杂 - 再次 - 将查询集存储在一些帮助结构中并在两个 View 中使用是没有问题的:

class ProjectQuerysets(object):
my_test_qs = Test.objects.filter(created_at__gte=now-timedelta(seconds=30)).all()

或事件更复杂:

class TestQSMixni(object):

def get_queryset(self, *args, **kwargs):
return Test.objects.filter(user=self.request.user) # something like that;

之后:

class TestList(TestQSMixin, APIView):

def get(self, *args, **kwargs):
queryset = self.get_queryset()

# and in REST:

class ServiceViewSet(TestQSMixin, viewsets.ModelViewSet):
serializer_class = ServicesSerializer
# no queryset needed here

(抱歉,例如使用此服务,但我在一些注释中有此 :))

希望对您有所帮助。

最后 - 这完全取决于您的需求 :) 和项目要求。

快乐编码。

关于Django REST 框架 - 根据请求提供常规网页和 API 响应的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41108254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com