【问题标题】:How to change a field that automatically affect other records in Django如何更改自动影响Django中其他记录的字段
【发布时间】:2019-08-06 14:06:25
【问题描述】:

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

考虑以下模型:

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 看到了类似的问题,但它是针对same 记录的更改。

【问题讨论】:

  • 要么覆盖AccountUser 模型的save() 方法,要么使用post_save() 信号处理程序。

标签: django django-models


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    相关资源
    最近更新 更多