Абстрактные модели Django — как реализовать конкретный доступ в методе абстрактного представления?

#python #django

#python #django

Вопрос:

Допустим, у меня есть абстрактная модель в Django с двумя моделями, расширяющимися от нее.

Как я могу управлять созданием одной из двух реализующих моделей внутри общего представления Django Rest Framework?

Мое решение приведено ниже:

     from enum import Enum
    from rest_framework.views import APIView

    class BazType(Enum):
        FOO = 1
        BAR = 2

    class AbstractView(APIView):
        def __init__self():
            #Init code here

        def _internal_method(self, django_model, this_type = BazType.FOO):
            if this_type == BazType.FOO:
                record, created = ConcreteModelOne.objects.get_or_create(some_field = django_model)
            elif this.type == BazType.BAR:
                record, created = ConcreteModelTwo.objects.get_or_create(some_field = django_model)
  

Это работает, но есть ли способ избавиться от блока if / else? Другими словами, есть ли способ из подкласса AbstractView передать некоторый идентификатор, для которого требуется модель для get_or_create вызова метода?

Ответ №1:

Вы можете создать сопоставление / словарь, который сопоставляет класс модели со значениями каждого Enum члена, и использовать его в своем _internal_method для получения класса модели с заданным Enum именем:

 class AbstractView(APIView):
        models_map = {1: ConcreteModelOne, 2: ConcreteModelTwo}

        def __init__(self):
            #Init code here

        def _internal_method(self, django_model, this_type=BazType.FOO):
            record, created = self.models_map[this_type].objects.get_or_create(some_field = django_model)