我有一个定制的save()方法,它检查对象的“活动”字段等于2,然后给所有子代字段(使用MPTT)相同的编号。
def save(self):
if self.active == 2:
self.get_descendants().update(active=2)
super(Post, self).save()
现在,当我更新()我的模型时,我希望这段代码也能工作。我应该尝试制定自定义更新方法吗?该怎么做呢?
发布于 2014-04-09 14:07:07
一个简单的解决方法是执行原始的更新,然后使用get_queryset_descendants()
为所有的后代做一个额外的更新。完整的代码如下:
qs = <some queryset>
qs.update(**values)
descendants = MyModel.objects.get_queryset_descendants(qs.filter(active=2))
descendants.update(active=2)
或者,如果您只想更新active
属性,可以一次完成:
qs = <some queryset>
descendants = MyModel.objects.get_querset_descendants(qs, include_self=True)
descendants.update(active=2)
当然,这可以包装在update
函数中。看起来是这样的:
from django.db import transaction
from django.db.models.query import QuerySet
class MyModelQuerySet(QuerySet):
def update(self, **kwargs):
with transaction.atomic(): # for Django >= 1.6
####### OR ######
with transaction.commit_on_succes(): # for Django <= 1.5
r = super(MyModelQuerySet, self).update(**kwargs)
descendants = self.model.objects.get_query_set_descendants(self.filter(active=2))
descendants.update(active=2)
return r
如果第二次更新失败,with transaction.atomic()
或with transaction.commit_on_succes()
将阻止第一次更新保存,这是为了确保在第二次更新出错时数据库级别的完整性。
您应该检查当前版本Django的文档,了解如何在自定义管理器(即mppt.managers.TreeManager
)中使用自定义查询集。
https://stackoverflow.com/questions/22972842
复制相似问题