fab*_*hel 3 django model mixins
我问自己在mixin中覆盖save方法是否有意义.
在我的项目中,我有充分的理由在几个模型中覆盖save方法.首先,我必须创建一个继承自的模型类models.Model.无论从语义上讲,我正在做的是给一个类一个角色(而不是自己定义一个对象),这就是为什么我认为写一个mixin更好.另一个原因是因为我们可能在不久的将来使用多重继承.另一方面,这一行在重写保存方法中:
super(MyMixin, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
不会产生敏感,因为它只能与django.db.models.Model类一起使用.
class MyMixin(object):
def save(self, *args, **kwargs):
...
super(MyMixin, self).save(*args, **kwargs)
...
Run Code Online (Sandbox Code Playgroud)
你能帮我决定最好的选择吗?(Mixin或定制型号)
mro(方法解析顺序)的工作方式,两种方法都是完全有效的.抽象模型的情况非常简单:你有一个单独的继承链,每个对super的调用都会在链中的下一个类上调用.所以如果你有:
class MyBaseModel(models.Model):
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
class MyModel(MyBaseModel):
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
呼叫MyModel将传播到MyBaseModel,并且呼叫MyBaseModel将传播到models.Model.
对于多重继承,继承链略有不同.继承链中的第一个类是定义的第一个基类.所以,如果你有class MyModel(MyMixin, models.Model),MyMixin将是第一堂课.接下来,当super()调用MyMixin(带有MyModel实例)时,它将查找MyMixin该类的兄弟.这意味着要调用的下一个方法是saveon方法models.Model.
考虑到这一点,使用mixin来覆盖保存方法是完全正确的.在这两种情况下,MyModel首先调用save方法,然后调用mixin/abstract模型的save方法,最后调用models.Modelsave方法.
注意:
这是在此特定情况下工作的方法解析顺序的简化说明.用于确定顺序的实际算法是C3线性化算法.可在此处找到完整的解释.
| 归档时间: |
|
| 查看次数: |
1999 次 |
| 最近记录: |