使用覆盖保存方法同步 Django 模型

时间:2021-05-26 21:17:26

标签: python django

我有一个 client 和一个 user 模型。 clientuser 都有一个名为 help_desk 的标志。帮助台客户端和用户将保持同步。这意味着:

  • 当用户被标记为 help_desk 时,他们将被添加到所有帮助台客户端
  • 当用户被取消标记为 help_desk 时,他们将从所有帮助台客户端中删除
  • 当客户被标记为 help_desk 时,所有帮助台用户都添加到其中
  • 当一个客户被取消标记为 help_desk 时,所有帮助台用户都将从它中删除

我一直试图通过使用以下内容覆盖 save() 方法来解决此问题:

客户

def save(self, *args, **kwargs):
    help_desk_users = get_user_model().objects.filter(is_help_desk=True)
    if self.help_desk:
        for user in help_desk_users:
            self.users.add(user)
    else:
        for user in self.users.all():
            if user in help_desk_users:
                self.users.remove(user)
    super().save(*args, **kwargs)

用户

def save(self, *args, **kwargs):
    if self.is_help_desk:
        for client in Client.objects.filter(help_desk=True):
            client.users.add(self)
    else:
        for client in Client.objects.filter(help_desk=True):
            client.users.remove(self)
    super().save(*args, **kwargs)

用户代码按预期工作,但客户端代码没有。我认为原因是您无法在覆盖的保存方法中进行批量更新 - 请参阅 docs。我的问题是,这仅仅是 Django 的限制吗?如果是这样,解决此类问题的最佳实践替代解决方案是什么?

1 个答案:

答案 0 :(得分:0)

对于寻找解决方案的其他人来说,上面的代码实际上在通过管理面板保存时不起作用。如果您希望在从管理面板保存时使用该功能,则必须覆盖 save_related 函数。这里有一个 article 更详细地解释了这个问题。

相关问题