我个人远离从使用管理页面,一旦你需要真正的商业逻辑,但这里是答案:
如果你只需要从管理页面做到这一点,你可以简单地覆盖管理员保存功能
class ParentAdmin(admin.ModelAdmin):
list_display = ('id', 'parent',)
def save_model(self, request, obj, form, change):
obj.save()
for c in obj.child_set.all():
if c.granparent != obj.grandparent:
c.grandparent = obj.grandparent
c.save()
admin.site.register(Parent, ParentAdmin)
但是,如果你想确保孩子总是更新,无论谁做了保存(),您可以
1.-覆盖模型的save()函数(但是这可能创造如果你的模型是循环依赖在不同的文件:
class Parent(models.Model):
grandparent = models.ForeignKey(GrandParent, null=True, blank=True, default=None)
def save(self, *args, **kwargs):
for c in self.child_set.all():
if c.granparent != self.grandparent:
c.grandparent = self.grandparent
c.save()
super(Parent, self).save(*args, **kwargs)
2:为了避免循环依赖,你可以使用一个信号捕捉保存并就此采取行动
from django.db.models.signals import post_save
from django.dispatch import receiver
class Child(models.Model):
parent = models.ForeignKey(Parent, null=True, blank=True, default=None)
grandparent = models.ForeignKey(GrandParent, null=True, blank=True, default=None)
@receiver(post_save, sender=Parent)
def post_save_parent_callback(sender, **kwargs):
parent = kwargs['instance']
for c in parent.child_set.all():
if c.granparent != parent.grandparent:
c.grandparent = parent.grandparent
c.save()
希望这有助于。
是否有一个原因,你想在你的数据库中有冗余数据?如果你的例子真的显示了你想要做的事情,我会完全忽略来自Child模型的祖父母字段。 –
是的,它是一个非常复杂的数据库设计的分析产品。在设计时,性能等等之间存在权衡。 –