如何更改自动影响Django中其他记录的字段

时间:2019-03-15 13:17:42

标签: django django-models

如何更改特定记录中的字段以自动影响其他记录中的同一字段?

请考虑以下模型:

class AccountUser(models.Model):
    ADMIN='A'
    USER='U'
    USER_PROFILES = (
        (ADMIN, 'Admin'),
        (USER, 'User'),
    )
    account = models.ForeignKey(Account, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    profile = models.CharField(max_length=1,choices=USER_PROFILES,default=USER)
    current_account = models.BooleanField(default=True)

    def __str__(self):
    return format('{} ({})'.format(self.account.name, self.user.username))

这是用户和帐户之间的多对多关系,因此用户可以位于多个帐户中。每个用户只能拥有一个并且只有一个当前帐户。然后,每次使用current_account = True创建或更新新记录时,来自同一用户的任何其他记录都应使用current_account = False更新。

我在Actions triggered by field change in Django中看到了类似的问题,但这是针对相同记录中的更改。

1 个答案:

答案 0 :(得分:1)

我认为您可以使用post_save信号实现此目的。希望我能理解您的逻辑,但是您可以简单地重构post_save静态方法来实现您的目标。

from django.db.models.signals import post_save

class AccountUser(models.Model):
    ADMIN='A'
    USER='U'
    USER_PROFILES = (
        (ADMIN, 'Admin'),
        (USER, 'User'),
    )
    account = models.ForeignKey(Account, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    profile = models.CharField(max_length=1,choices=USER_PROFILES,default=USER)
    current_account = models.BooleanField(default=True)

    @staticmethod
    def post_save(sender, instance):
        records = AccountUser.objects.filter(user = instance.user)
        for record in records:
            record.current_account = True
            record.save()

    def __str__(self):
        return format('{} ({})'.format(self.account.name, self.user.username))

 post_save.connect(AccountUser.post_save, sender=AccountUser)