从同一模型中的两个外键创建关系

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")