通过refresh_from_db()

时间:2018-08-27 16:11:54

标签: python django orm

我以永不删除的方式设置了模型,而是将状态更新为状态“已删除”。为此,我重写了delete()方法,如下所示:

def delete(self, using=None, keep_parents=False):
    self.status = Booking.DELETED
    self.save()

并添加了两个自定义管理器以跟踪已删除的未删除预订,将标准管理器与交换,仅返回未删除的对象。

class BookingManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().exclude(status=Booking.DELETED)

class BookingDeletedManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(status=Booking.DELETED)

class Booking(models.Model):
    PAYED = 0
    PENDING = 1
    OPEN = 2
    CANCELLED = 3
    DELETED = 4
    objects = BookingManager()
    deleted_objects = BookingDeletedManager()
...

现在,当我有一个预订对象并将其删除时

booking.delete()

像这样刷新它

booking.refresh_from_db()

我得到了错误

.models.DoesNotExist: Booking matching query does not exist

如果我使用正确的管理器

Booking.deleted_objects.get(pk=booking.id)

我正确地获得了预订信息,我假设refresh_from_db方法使用的标准对象管理器找不到正确的预订信息。有没有解决这个问题的方法,还是我错误地解决了这个问题?

1 个答案:

答案 0 :(得分:1)

refresh_from_db只是models.Model类中的一个方法,因此您可以在Booking模型中覆盖它。参见此处获取源代码: https://docs.djangoproject.com/en/2.1/_modules/django/db/models/base/#Model.refresh_from_db

您只需要更改db_instance_qs即可使用BookingDeletedManager()