我有一个自定义函数,在删除模型订单的对象时会调用该函数,为此我使用了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()函数有问题吗?答案 0 :(得分:1)
我认为此代码存在一些问题:
__equal
字段查找,但是此查找确实在最接近的standard field lookups [Django-doc]列表中不存在 是__exact
,但此处可能没有必要; 后删除意味着删除已经发生,因此此时实例不再在数据库中,如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}}。