从同一模型中的两个外键创建关系
Creating a relation out of two ForeignKeys in the same model
在下面的示例中,如果我创建了一个角色,我如何才能使该角色自动更新 Member.band 使用该角色中指定的乐队和成员值。目前我必须记得在管理员中手动添加该隐式关系。
models.py
class Band(models.Model):
pass
class Member(models.Model):
band = models.ManyToManyField(Band)
class Role(models.Model):
band = models.ForeignKey(Band)
member = models.ForeignKey(Member)
如果您只想在管理员中使用它,那么您可以覆盖 save_model()
方法:
class RoleAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
obj.save()
if not change:
obj.member.band.add(obj.band)
另一种选择是使用 post_save
信号。如果这种情况,代码也会 运行 在管理员之外:
def add_band(sender, instance, created, **kwargs):
if created:
instance.member.band.add(instance.band)
post_save.connect(add_band, sender=Role, dispatch_uid="add_band")
在下面的示例中,如果我创建了一个角色,我如何才能使该角色自动更新 Member.band 使用该角色中指定的乐队和成员值。目前我必须记得在管理员中手动添加该隐式关系。
models.py
class Band(models.Model):
pass
class Member(models.Model):
band = models.ManyToManyField(Band)
class Role(models.Model):
band = models.ForeignKey(Band)
member = models.ForeignKey(Member)
如果您只想在管理员中使用它,那么您可以覆盖 save_model()
方法:
class RoleAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
obj.save()
if not change:
obj.member.band.add(obj.band)
另一种选择是使用 post_save
信号。如果这种情况,代码也会 运行 在管理员之外:
def add_band(sender, instance, created, **kwargs):
if created:
instance.member.band.add(instance.band)
post_save.connect(add_band, sender=Role, dispatch_uid="add_band")