gpt4 book ai didi

python - Django post_delete : count all objects which have one matching attribute with deleted object

转载 作者:行者123 更新时间:2023-12-01 09:02:55 25 4
gpt4 key购买 nike

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

模型“Orders”的实例始终具有外键“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,它也不是 true。您发现我的 count() 函数有任何问题吗?

最佳答案

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

  1. 您似乎使用了 __equal 字段查找,但此查找存在于 standard field lookups [Django-doc] 列表中,最接近的是__exact,但这里可能没有必要;

  2. 您使用“一揽子异常(exception)”(!),这是一种严重的反模式:如果出现问题,那么您将永远不会收到有关那。就像Python禅宗所说:永远不要默默地传递异常,除非明确地沉默

  3. 删除后意味着删除已经发生,因此此时该实例不再存在于数据库中,如 documentation 中所指定:

    Note that the object will no longer be in the database, so be very careful what you do with this instance.

因此,最后一项意味着您可能想要检查计数是否为零(因此不再存在具有该 user_idOrder):

@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 而没有任何 Order 的情况:例如,当我们更改 Order 的 user_id ,那么有可能之前的用户已经不再拥有了,但是这个函数不会被触发。因此,定期检查数据库是否存在此类情况可能是值得的。

此外,我不知道删除 User 是否是一个好主意。如果这是 Django 中的身份验证模型,则可能会导致管理员用户被删除,例如,如果意外地在其姓名上下了订单,并且该订单稍后被删除。此外,删除用户可能会导致大规模的删除(涉及该用户的各种“实体”)。

Note: a Django model normally has a singular name, so I adivce, like I did in the answer, to rename the Orders model to Order.

关于python - Django post_delete : count all objects which have one matching attribute with deleted object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52320080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com