我有一个自定义函数,在删除模型订单的对象时调用,我使用post_delete。
模型“Orders”的实例始终具有ForeignKey“user”。当删除模型“订单”的对象时,我想检查模型“订单”的其他实例是否具有相同的“用户”。
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()函数有什么问题吗?
我认为这段代码存在一些问题:
__equal
字段查找,但这个查找不存在于standard field lookups [Django-doc]列表中,最接近的是__exact
,但这里可能没有必要;因此,最后一项意味着您可能想要检查计数是否为零(因此不再存在与Order
相关的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
s的Order
s的场景:例如,当我们更改user_id
的Order
时,之前的用户可能不再拥有,但此函数将没有被触发。因此,定期检查数据库是否值得这样做。
此外,我不知道是否删除User
是一个好主意。如果这是Django中的身份验证模型,则可能导致管理员用户被删除,例如,如果意外地将订单放在他们的名称上,并且该订单稍后被删除。此外,移除用户可能导致大量的删除(涉及该用户的所有类型的“实体”)。
注意:Django模型通常具有单数名称,因此我喜欢将
Orders
模型重命名为Order
,就像我在答案中所做的那样。