python - 重写model.Manager方法后Django无法删除单个对象

标签 python django django-models

我正在尝试重写 django 管理器 (models.Manager) 上的 get_by_natural_key 方法。添加模型 (NexchangeModel) 后,我可以删除所有 () 对象,但不能删除单个对象。

可以:

SmsToken.objects.all().delete()

不能:

SmsTokent.objects.last().delete()

代码:

from django.db import models
from core.common.models import SoftDeletableModel, TimeStampedModel, UniqueFieldMixin

class NexchangeManager(models.Manager):
    def get_by_natural_key(self, param):
        qs = self.get_queryset()
        lookup = {qs.model.NATURAL_KEY: param}
        return self.get(**lookup)


class NexchangeModel(models.Model):
    class Meta:
        abstract = True
    objects = NexchangeManager()

class SmsToken(NexchangeModel, SoftDeletableModel, UniqueFieldMixin):
    sms_token = models.CharField(
        max_length=4, blank=True)
    user = models.ForeignKey(User, related_name='sms_token')
    send_count = models.IntegerField(default=0)

最佳答案

当您打电话时: SmsToken.objects.all().delete() 您正在调用查询集的 delete 方法。

但是在 SmsTokent.objects.last().delete() 上,您正在调用实例的 delete 方法。

在 django 1.9 之后,queryset delete 方法返回没有删除的项目。 REF

Changed in Django 1.9: The return value describing the number of objects deleted was added.

但是在 delete 实例中,Django 方法已经知道只会删除一行。

还要注意,querset的delete方法和instance的delete方法是不一样的。

The delete()[on a querset] method does a bulk delete and does not call any delete() methods on your models[instance method]. It does, however, emit the pre_delete and post_delete signals for all deleted objects (including cascaded deletions).

因此您不能依赖方法的响应来检查删除是否正常进行。但就 python 的哲学而言,“请求宽恕而不是许可”。这意味着您可以依靠异常来查看删除是否按应有的方式正常工作。 Django 的 ORM 将引发适当的异常并在出现任何故障时进行适当的回滚。

所以你可以这样做:

try:
    instance.delete()/querset.delete()
except Exception as e:
    # some code to notify failure / raise to propagate it
    # you can avoid this try..except if you want to propagate exceptions as well.

注意:我正在捕获一般异常,因为我的 try block 中的唯一代码是 delete。如果您希望有一些其他代码,那么您必须只捕获特定的异常。

关于python - 重写model.Manager方法后Django无法删除单个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42828497/

相关文章:

django - 无法在迁移中添加新字段: "column .. does not exist"

python - 使用 python 库 rply 时,在解析多行时出现意外的标记错误。我怎样才能解决这个问题?

python - 添加数字时 python/numpy 中的浮点精度分解

python - 有没有一种方法可以在没有 UI 的情况下在浏览器中登录 django Rest api?

python - Django 模型形式 - 多个模型

django - Django:将模型重构为单独的文件后,它们无法被syncDB或south识别

python - Flask 文件上传挂起

python - 我如何从生命线中的 coxPHFitter 函数和变量系数中提取基线危险

python - jinja2 中带有 html 标签的 Django 模板

python - 招摇的 API 文档