2017-01-29 8 views
0

私はDjangoの初心者、特に継承ツールです。 は、私は次のようなアーキテクチャを持っている:Djangoの子クラスは親抽象クラスのオーバーロードされたsaveメソッドを継承します

class BaseMixin(models.Model): 
     effective_from = models.DateTimeField(blank = True, null = True) 

     class Meta: 
      abstract = True 
    class QuerySetManager(models.Manager): 
     def get_queryset(self): 
      # ... 
     def __getattr__(self, attr, *args): 
      return getattr(self.get_queryset(), attr, *args) 
     def save(self, *args, **kwargs): 
      # I want this method to be deployed for my_model_instance.save() 

    class MyModel(BaseMixin): 
     # ... 
     objects = QuerySetManager() 

     class Meta: 
      managed = False 
      db_table = 'my_model' 

     class QuerySet(QuerySet): 
      # ... 

だから私の目標は、my_model_instanceし、変更を保存しようとしたときQuerySetManagersaveメソッドを呼び出すことです。問題は、私はメソッドをBaseMixinにオーバーロードする必要がありますか?またはQuerySetManagerにありますか?私は両方とも結びついていますが、今のところ、Djangoはどちらの場合も私のカスタム保存メソッドを無視しています。

答えて

2

あなたのBaseMixinはあなたが他の場所で継承している抽象クラスです。

ModelManagerは保存メソッドを提供しません。特定のモデルにクエリを実行しながら複雑なロジックを抽象化するためのものです。

save MyModelをここで上書きする必要があります。何かのようなもの。

class MyModel(BaseMixin): 
    # ... 
    objects = QuerySetManager() 

    class Meta: 
     managed = False 
     db_table = 'my_model' 


    def save(self, force_insert=False, force_update=False, using=None, 
     update_fields=None): 
     print "In Save Method" 
     return super(MyModel, self).save() 

Saveメソッドは、モデルインスタンスのプロパティです。

単純な例。

def my_view(request,pk): 
    my_model = MyModel.object.get(id=pk) 
    my_model.field_1 = "new value" 
    ## When you call save method your custom save method is called first. 
    my_model.save() 
+0

Bipulさんはあなたの回答をすべて正直に理解していませんでした。そして、そのようなアプローチでsaveメソッドを呼び出す構文は何ですか? –

+0

'def save'は単なる単純なビューですか? –

+0

残念なことにdef saveはインデントの問題でした:)もっと多くの例が追加されました。 –

関連する問題