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