Django REST框架-根据请求提供常规网页和API响应的视图
我正在使用Django REST框架编写一个网站。这是我和其他人在一起的第一天,所以请容忍我。基本上问题是,Django REST框架-根据请求提供常规网页和API响应的视图,django,django-rest-framework,Django,Django Rest Framework,我正在使用Django REST框架编写一个网站。这是我和其他人在一起的第一天,所以请容忍我。基本上问题是, 我能否提出一个基于类的视图,既可以作为Android开发人员的API(带有JSON响应),也可以作为呈现常规Django模板的视图?或者为此我必须定义两种不同的观点 如果问题1的答案是我必须定义两个不同的视图,那么考虑到查询集是相同的,那么最枯燥的方法是什么 观点: class TestList(APIView): renderer_classes = [Template
class TestList(APIView):
renderer_classes = [TemplateHTMLRenderer]
template_name = 'android/test.html'
def get(self, request):
queryset = Test.objects.all()
return Response({'test_qs': queryset})
换句话说,假设我有一个模型queryset,我想在我的网站上把它呈现给我的最终用户,并把它发送给我的Android开发者。REST框架代码体系结构方面的最佳实践是什么?两种不同的基于类的视图?还是一个视图中包含两种方法?或者一个视图和一个神奇的方法可以同时完成这两项工作?我建议将其分开。使用简单CRUD-您不会遇到DRY的问题,因为它们只是不同的视图,请考虑: DRF(基本上,这都是针对CRUD的,如果您只想要一个列表,请使用:ListModelMixin): 我认为,将此合并到一个视图中——迟早会让你陷入麻烦 什么样的麻烦
- 在某些情况下,模板可以使用比RESTAPI多得多的数据向用户显示页面(简单的示例:current time)——您将开始为模板实现不同的上下文,为REST实现不同的上下文李>
- 我再也没有想到什么;)但我有一种感觉,两种不同的观点使它更干净
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
(例如,很抱歉使用此服务,但我在一些注释中有此说明:))
希望这能对你有所帮助
最后,这完全取决于您的需求:)和项目要求
愉快的编码。我非常愿意接受答案。仅仅因为缺乏经验,我不能把你说的话拼凑起来。您能提供常规模板的视图框架和REST的视图吗?他们是完全独立的,还是有共同点?我非常感谢您能扩展或修改我在问题中提到的示例,虽然从不同的角度提出,但仍然是相关的问题()
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