#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"