2016-10-12 21 views
0

假設我在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)