写 model 的时候发现有些东西在重复,第一反应就是写个基类,把这些重复的东西拿出来,然而 Model 类之间继承却不是那么方便的,应该会影响到 ORM 的行为。 怎么办呢?幸好 python 有多重继承。 下面就是项目中做这些重复事情的类:
class ModelMixin(object): def save(self): if not self.id: # creation time if hasattr(self, 'pubdate'): self.pubdate = datetime.now() if hasattr(self, 'pubtime'): self.pubtime = datetime.now() if hasattr(self, 'updatedate'): self.updatedate = datetime.now() if hasattr(self, 'updatetime'): self.updatetime = datetime.now() if hasattr(self, 'number'): # 今天第几次发布 self.number = self.__class__.objects.filter(pubdate=datetime.now()).count()+1 if hasattr(self, 'before_save'): self.before_save() super(ModelMixin, self).save() if hasattr(self, 'after_save'): self.after_save()注意:django 将废弃 auto_add 和 auto_now 这些东西,认为太 magic ,建议在 save 中处理,所以上面这个类就更有用了。 怎么用呢?
class Product(ModelMixin, models.Model): pubdate = models.DateField(u'...', editable=False) number = models.IntegerField(u'...', editable=False) ...这样 pubdate 和 number 自然就有了相应的含义了。另外 ModelMixin 还定义了 before_save 和 after_save 的钩子,具体 model 可以在这两个方法里放点代码,比如:
def before_save(self): self.totalprice = self.count * self.product.unitprice ... def after_save(self): if self._create: p = OutProduct(postuser=self.postuser,count=1, pubdate=self.pubdate,mainproduct=self) p.save()这些都是项目中直接拷出来的代码,具体意思你就慢慢猜吧,呵呵。 多重继承的实现其实是个还算复杂的过程,复杂的多重继承也会产生一些奇特的行为,不过基本上只要遵守一些良好的习惯(比如常用 super ,虽然写起来有些繁琐),了解一些多重继承的基本原理,基本上不会遇到什么奇怪的问题了。 关于 python 多重继承的实现,请看:The Python 2.3 Mehod Resolution Order
3 评论:
在model里面重载 save()方法应该也行吧。。。。
不过你的是为了公用 呵呵
目前的这个博客是你自己做的吗?
是 google 的 blogger ,不过模板是我改的。
发表评论