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

Django REST框架-根据请求提供常规网页和API响应的视图,django,django-rest-framework,Django,Django Rest Framework,我正在使用Django REST框架编写一个网站。这是我和其他人在一起的第一天,所以请容忍我。基本上问题是, 我能否提出一个基于类的视图,既可以作为Android开发人员的API(带有JSON响应),也可以作为呈现常规Django模板的视图?或者为此我必须定义两种不同的观点 如果问题1的答案是我必须定义两个不同的视图,那么考虑到查询集是相同的,那么最枯燥的方法是什么 观点: class TestList(APIView): renderer_classes = [Template

我正在使用Django REST框架编写一个网站。这是我和其他人在一起的第一天,所以请容忍我。基本上问题是,

  • 我能否提出一个基于类的视图,既可以作为Android开发人员的API(带有JSON响应),也可以作为呈现常规Django模板的视图?或者为此我必须定义两种不同的观点
  • 如果问题1的答案是我必须定义两个不同的视图,那么考虑到查询集是相同的,那么最枯燥的方法是什么
  • 观点:

    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实现不同的上下文
    • 我再也没有想到什么;)但我有一种感觉,两种不同的观点使它更干净
    我也理解重复同一代码两次的风险——但您总是可以将重复代码提取到一些有用的结构中

    至于queryset,如果它很简单的话,就不要麻烦用一个地方来存储它。如果查询集变得复杂,那么将查询集存储在某个帮助结构中并在两个视图中使用也没有问题:

    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