Django:在mixin中覆盖save方法是否有意义?

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或定制型号)

knb*_*nbk 8

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线性化算法.可在此处找到完整的解释.