2016-10-12 24 views
0

私はDjangoに抽象モデルを持っていて、それから2つのモデルが拡張されています。Django抽象モデル - 抽象ビューメソッドで特定のアクセスを実装する方法は?

Django Rest Frameworkの汎用ビューでは、2つの実装モデルのいずれかの作成をどのように制御できますか?

私のソリューションは以下の通りです:

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) 

それは動作しますが、もし/ elseブロックを取り除くための方法はありますか?言い換えれば、AbstractViewのサブクラスから、get_or_createメソッド呼び出しに必要なモデルの識別子を渡す方法がありますか?

答えて

1

あなたは、各Enumメンバーの値にモデルクラスをマッピングするマッピング/辞書を作成し、Enum名を指定されたモデルクラスをフェッチするためにあなたの_internal_methodでそれを使用することができます。

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) 
関連する問題