Django 在这种情况下,如何编写mixin以避免重复代码

Django 在这种情况下,如何编写mixin以避免重复代码,django,Django,Django==2.2.5 有三个层次在逻辑上相互嵌套。 这里的问题是save方法中的重复代码 你能帮我创造一个混音,不要重复我自己吗 class Level_1(PhraseMixin, ArchivedMixin, models.Model): def save(self, *args, **kwargs): """ If this level is archived, then make all sublevels archived too.

Django==2.2.5

有三个层次在逻辑上相互嵌套。 这里的问题是save方法中的重复代码

你能帮我创造一个混音,不要重复我自己吗

class Level_1(PhraseMixin, ArchivedMixin, models.Model):

    def save(self, *args, **kwargs):

        """
        If this level is archived, then make all sublevels archived too.
        """
        if self.archived:
            level_2_set = self.level_2_set.all()
            for level_2_obj in level_2_set:
                level_2_obj.archived = True
                level_2_obj.save()

        super(Level_1, self).save(*args, **kwargs)



class Level_2(ArchivedMixin,
              PhraseMixin,
              ValidateParentMixin,
              models.Model):
    parent_level = models.ForeignKey(Level_1,
                                     verbose_name="Level 1",
                                     on_delete=models.CASCADE)
    def save(self, *args, **kwargs):
        """
        If this level is archived, then make all sublevels archived too.
        """


        if self.archived:
            level_3_set = self.level_3_set.all()
            for level_3_obj in level_3_set:
                level_3_obj.archived = True
                level_3_obj.save()

        super(Level_2, self).save(*args, **kwargs)    


class Level_3(PhraseMixin,
              ArchivedMixin,
              WhereMixin,
              ValidateParentMixin,
              models.Model):
    parent_level = models.ForeignKey(Level_2,
                                     verbose_name="Level 2",
                                     on_delete=models.CASCADE)

看起来您缺少
def save(self,*args,**kwargs):
第2级
声明,谢谢您的评论。我在这里复制代码时只漏了一行。现在已经编辑好了。为什么不创建一个类,并编写某种验证以确保嵌套级别的最大深度为3?@Michael Nico的问题值得考虑-您没有提供任何上下文,并且可能(或者没有…)有更好的设计开始-这可能(或者没有…)是XY问题()。另外,与直接
queryset.update()
操作相比,在模型实例上循环并逐个保存它们是非常低效的(并且是不安全的wrt/竞争条件)