2016-12-02 114 views
0

我需要实现的最好方法是用示例来描述。想象一下,我有多个模型(比如说,模型Task和模型Animals)具有名为foo的字段,我的目标是为所有这些模型执行相同的一组MySQL事务。例如,我想将给定实例的所有foos以及随后的实例(具有更大的ID)递增1。喜欢的东西:为所有类型的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) 

的问题是,是否有可能在Django写在一定意义上通用的功能,我可以使用example_viewAnimalsTasks等,只要所有的人都在认为上述领域?如果是的话,INSTANCE_MODEL.objects....的有效语法是什么?

+0

这是原则叫鸭-typing;只要一个对象响应一个接口,它就不管它是什么类。那么,你的问题到底是什么? –

+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功能。

0

您可以创建在你的模型的功能由一个所有foo这样的递增:

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) 

你可以把它在你的观点:task_instance.increment_foo()animal_instance.increment_foo()