Наследование представлений на основе классов Django REST Framework

#django #inheritance #django-rest-framework #django-views

#django #наследование #django-rest-framework #django-представления

Вопрос:

Я использую Django REST Framework, и я оказался в следующей ситуации: у меня есть два APIView s, которые идентичны друг другу, за исключением порядка объектов, которые они возвращают:

 # 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 объекты. Как я могу создать родительское представление, содержащее общий код, и дочернее представление для сортировки объектов?

Ответ №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"