2016-12-02 3 views
0

私が達成する必要があるのは、例で説明するのが最も良いです。私がモデルTaskとモデルAnimals)のフィールドがfooという複数のモデルがあり、私の目標はこれらすべてのモデルに対して同じ一連のMySQLトランザクションを実行することです。たとえば、あるインスタンスのfoosを1つ増やして、その後のインスタンス(大きなIDを持つインスタンス)と一緒に増やしたいとします。ような何か:すべてのタイプのDjangoモデル用ジェネリック関数を書く

def example_view(instance): 
    instance.foo = instance.foo + 1 
    instance.save() 
    id = instance.id 
    INSTANCE_MODEL.objects.filter(id__gt = instance.id).update(foo = foo + 1) 

質問は、あるそれは限り、それらのすべてがビューに言及したフィールドを持っているように、私はAnimalsexample_viewTasksなどを使用することができるという意味で、一般的な関数を記述するためにはDjangoで可能です?はいの場合、INSTANCE_MODEL.objects....の有効な構文は何ですか?

+0

class Task(models.Model): .... foo = .... def increment_foo(self): self.foo = self.foo + 1 self.save() #increment by one all the foos Task.objects.filter(id__gt = self.id).update(foo = foo + 1) class Animal(models.Model): .... foo = .... def increment_foo(self): self.foo = self.foo + 1 self.save() #increment by one all the foos Animal.objects.filter(id__gt = self.id).update(foo = foo + 1) 

であなたはあなたのビューでそれを呼び出すことができます-タイピング;オブジェクトがインタフェースに応答する限り、どのクラスであっても問題はありません。だからあなたの質問は何ですか? –

+0

'INSTANCE_MODEL'の正しい構文は' type(instance) 'か' instance._meta.model'かもしれませんが、単に 'type()'を使うだけです。 –

答えて

1

mixinを使用してください。

def MixIn(pyClass, mixInClass): 
    pyClass.__bases__ += (mixInClass,) 

class Person(..sql model class..): 
    ... 
class Order(..sql model class..): 


class MyMixinClass(object): 
    def dummy(self): 
     print("This method should be visible in Person and Order classes") 

# apply mixin to Person and Order 
MixIn(Person, MyMixinClass) 
MixIn(Order, MyMixinClass) 

p = Person() 
p.dummy() # it's ok 

o = Order() 
o.dummy() # it's ok 

一般に、..sql model .. classから派生した別の基本クラスを定義するとよいでしょう。

class MyBaseModel(..sql model class..): 
    def dummy(self): 
     ... 

class Person(MyBaseModel): 
    ... 

class Order(MyBaseModel): 
    .... 

あなたはDjangoでそれにチャンスを与えることができますが、PyramidSQLAlchemyにそれが何らかの理由で動作しません(それは私には不明である)ので、私は単にダイナミックMixIn関数を使用します。あなたは1このようにすべてのfooずつ増加するためにあなたのモデルに関数を作成することができます

0

:これはアヒルと呼ばれる原則であるtask_instance.increment_foo()またはanimal_instance.increment_foo()

関連する問題