当前位置: 首页 > 面试题库 >

Django从post_save信号访问ManyToMany字段

殷承恩
2023-03-14
问题内容

我有一个Django模型,我想在保存时或保存后修改对象权限。我已经尝试了几种解决方案,并且post_save信号似乎是我想要做的最好的选择:

    class Project(models.Model):
        title = models.CharField(max_length=755, default='default')
        assigned_to = models.ManyToManyField(
            User, default=None, blank=True, null=True
        )
        created_by = models.ForeignKey(
            User,
            related_name="%(app_label)s_%(class)s_related"
        )


    @receiver(post_save, sender=Project)
    def assign_project_perms(sender, instance, **kwargs):
        print("instance title: "+str(instance.title))
        print("instance assigned_to: "+str(instance.assigned_to.all()))

在这种情况下,当创建一个Project时,信号将触发,并且我看到title,但是该assigned_to字段为空列表。

保存后如何访问保存的assigned_to数据?


问题答案:

你不会的 M2M是在实例保存后保存的,因此在所有m2m更新中都不会有任何记录。进一步的问题(即使你解决了这个问题)是,你仍在事务中,并且查询数据库无论如何都不会使你处于正确的状态。

解决方案是插入m2m_changed信号而不是post_save



 类似资料:
  • 问题内容: 假设我有这样的模型 如果事件添加/删除了一些用户,您如何建议更新users_count值? 问题答案: 如果可能的话,您可以引入将Event和User连接起来的模型: 并处理发送的pre_save信号以更新计数。这将大大简化m2m的处理。而且在大多数情况下,后来发现,某些逻辑和数据最适合中间模型。如果不是这种情况,请尝试使用自定义解决方案(您应该没有太多将用户添加到事件的代码路径)。

  • 问题内容: 我有一个关于django的问题。 我这里有许多对多模型 对于创建的1个购物车对象,我可以插入尽可能多的新TransactionDetail对象(产品和金额)。我的问题是。如何实现触发器?我想要的是每当创建交易明细时,我希望产品的存货数量减去交易明细中的数量。 我已经阅读了有关post_save()的信息,但不确定如何实现。也许像这样 什么时候: 问题答案: 如果你真的想使用信号来实现这

  • 问题内容: 我有一个“喜欢”功能,就像社交网络“喜欢”或“竖起大拇指”功能一样;用户单击星号/心形/任何内容以将内容标记为喜欢。它是用ajax完成的,并且必须快速。这里唯一的问题是,由于某些原因,我必须为每个“赞”执行一些任务,而我发现它们是在“赞”视图中直接编码的,这使其运行缓慢。我正在考虑使用信号来使这些任务的执行异步,以便视图可以立即将json发送回javascript,而无需等待任务完成。

  • 问题内容: 我在我的项目中完成了以下post_save信号。 在operation_by列中,我想获取user_id并将其存储。知道怎么做吗? 问题答案: 不能做 当前用户只能通过请求使用,而在使用纯模型功能时则不可用。以某种方式访问​​视图中的用户。

  • 问题内容: 我试图将“信息”对象连接到许多“客户”(请参见下面的代码) 更新一个信息对象后,我想向与该信息连接的每个客户发送电子邮件。 但是,当我记录信号接收到的sold_to字段时,在保存之前,我总是会得到类似的数据。 我猜这是因为它的ManyToManyField和数据存储在单独的表中,但是在更新所有关系之后不应该调用post_save信号吗? 有人提出解决方案的建议吗? 编辑:#django

  • 问题内容: 在我的应用程序中,我想在新用户注册时在某些表中创建条目。例如,我要创建一个用户个人资料,然后将参考他们的公司和一些其他记录。我用post_save信号实现了这一点: 运行时效果很好。我可以使用admin创建一个新用户,其他三个表也可以获取有意义的条目。(除非是雇员,因为保存时未在管理员表单中填写user.first_name和user.last_name。我仍然不明白为什么要这样做)