【问题标题】:Django REST Framework class-based views inheritanceDjango REST Framework 基于类的视图继承
【发布时间】:2020-09-28 07:11:27
【问题描述】:

我正在使用 Django REST Framework,发现自己处于以下情况:我有两个 APIViews,除了它们返回的对象的顺序之外,它们彼此相同:

# Route: "/new"
class NewView(APIView):
    """
    Returns JSON or HTML representations of "new" definitions.
    """
    renderer_classes = [JSONRenderer, TemplateHTMLRenderer]

    def get(self, request):

        # Queryset
        definitions = Definition.objects.filter(language=get_language())
        definitions = definitions.order_by("-pub_date")

        # HTML
        if request.accepted_renderer.format == "html":
            context = {}
            context["definitions"] = definitions
            context["tags"] = get_tags(definitions)
            return Response(context, template_name="dictionary/index.html")

        # JSON
        serializer = DefinitionSerializer(definitions, many=True)
        return Response(serializer.data)

# Route: "/random"
class RandomView(APIView):
    """
    Returns JSON or HTML representations of "random" definitions.
    """
    renderer_classes = [JSONRenderer, TemplateHTMLRenderer]

    def get(self, request):

        # Queryset
        definitions = Definition.objects.filter(language=get_language())
        definitions = definitions.order_by("?")

        # HTML
        if request.accepted_renderer.format == "html":
            context = {}
            context["definitions"] = definitions
            context["tags"] = get_tags(definitions)
            return Response(context, template_name="dictionary/index.html")

        # JSON
        serializer = DefinitionSerializer(definitions, many=True)
        return Response(serializer.data)

如您所见,这两个视图之间唯一改变的行是对Definition 对象排序的行。 如何创建包含共享代码的父视图和对对象进行排序的子视图?

【问题讨论】:

    标签: django inheritance django-rest-framework django-views


    【解决方案1】:
    class BaseView(APIView):
        order_field = None
        """
        Returns JSON or HTML representations of "new" definitions.
        """
        renderer_classes = [JSONRenderer, TemplateHTMLRenderer]
    
        def get(self, request):
    
            # Queryset
            definitions = Definition.objects.filter(language=get_language())
            definitions = definitions.order_by(self.order_field)
    
            # HTML
            if request.accepted_renderer.format == "html":
                context = {}
                context["definitions"] = definitions
                context["tags"] = get_tags(definitions)
                return Response(context, template_name="dictionary/index.html")
    
            # JSON
            serializer = DefinitionSerializer(definitions, many=True)
            return Response(serializer.data)
    
    
    class RandomView(BaseView):
        order_field = "?"
    
    
    class NewView(BaseView):
        order_field = "-pub_date"
    

    【讨论】:

      猜你喜欢
      • 2019-07-30
      • 2012-10-27
      • 2015-12-04
      • 2018-12-11
      • 2015-11-24
      • 2019-04-22
      • 1970-01-01
      • 2018-06-26
      • 2018-11-19
      相关资源
      最近更新 更多