Django 在这种情况下,如何编写mixin以避免重复代码
Django==2.2.5 有三个层次在逻辑上相互嵌套。 这里的问题是save方法中的重复代码 你能帮我创造一个混音,不要重复我自己吗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.
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/竞争条件)