Django post_delete:将具有一个匹配属性的所有对象与已删除的对象进行计数

时间:2018-09-13 18:50:40

标签: python django filter count signals

我有一个自定义函数,在删除模型订单的对象时会调用该函数,为此我使用了post_delete。

模型“ Orders”的实例始终具有ForeignKey“ user”。删除模型“ Orders”的对象时,我要检查是否存在具有相同“用户”的模型“ Orders”的其他实例。

def delete_reverse(sender, **kwargs):
try:
    if Orders.objects.filter(user__equal=kwargs['instance'].user).count() == 1:
        kwargs['instance'].user.delete()
    else:
        ...         
except:
    pass
post_delete.connect(delete_reverse, sender=Orders)

不幸的是,if条件不起作用,即即使根据条件项的计数应该为1也不成立。

您发现我的count()函数有问题吗?

1 个答案:

答案 0 :(得分:1)

我认为此代码存在一些问题:

  1. 您似乎使用了 __equal 字段查找,但是此查找确实在最接近的standard field lookups [Django-doc]列表中不存在 __exact,但此处可能没有必要;
  2. 您使用的是“ 空白例外”(!),这是一种严重的反模式:如果某件事失败了,您将永远不会得到通知。就像Python的 Zen 所说:除非明确地沉默,否则请不要默默地传递异常。
  3. 后删除意味着删除已经发生,因此此时实例不再在数据库中,如documentation中所指定:

      

    请注意,该对象将不再位于数据库中,因此请非常小心使用此实例。

因此,最后一项表示您可能想检查计数是否为零(因此,不再存在带有Order的{​​{1}}):

user_id

但是请注意,即使这样做,在某些情况下数据库仍可以包含@receiver(post_save, sender=Orders) def delete_reverse(sender, instance, **kwargs): if not Order.objects.filter(user_id=instance.user_id).exists(): instance.user.delete(),而没有任何User:例如,当我们更改{{ 1}},那么以前的用户可能不再拥有该用户,但是不会触发此功能。因此,定期检查这种情况可能值得。

此外,我不知道删除Order是否是个好主意。如果这是Django中的身份验证模型,则可能会导致删除管理员用户的事实(例如,无意中在其名称上放置了一个订单,后来又删除了该订单)。此外,删除用户可能会导致大量删除操作(涉及该用户的各种“实体”)。

  

注意:Django模型通常具有单数名称,因此我像在答案中一样将user_id模型重命名为{ {1}}。