【发布时间】:2016-01-11 07:06:06
【问题描述】:
我有以下型号:
class Camera(models.Model)
deleted_images_counter = models.IntegerField(...)
class Image(models.Model)
image = models.ImageField(....)
camera = models.ForeignKey(Camera)
现在,我想在删除一张或多张图片时更新相机 deleted_images_counter 字段。
我虽然关于使用信号:
@receiver(pre_delete, sender=Image,dispatch_uid="test" )
def update_deleted_images_counter(sender, instance, using, **kwargs):
camera = instance.camera
camera.counter = camera.counter + 1
camera.save()
但问题是它在对象级别工作,所以如果我想删除 200,000 张图像,它必须对相机进行相同数量的更新。
我有什么方法可以创建一个新方法或一个信号来做这样的事情吗?
images_to_delete = Images.objects.filter(...)
images_to_delete.delete()
#some method of something
def delete(queryset, ....):
#update the counter
camera.deleted_images_counter = camera.deleted_images_counter + queryset.count()
camera.save()
#continue with the delete...
queryset.delete()
谢谢!
编辑 1:
我刚刚注意到我想做的事情有一个缺陷。我假设要删除的图像属于同一台相机,但是如果它们不是来自同一台相机,那么这种方法将不起作用。我想实现我想要的唯一方法是在听众中......
【问题讨论】:
-
必须在模型级别发生吗?批量删除图像会发生这种情况吗?或者我应该问图像是如何删除的?
-
你使用的是什么版本的 Django? Since 1.9
delete返回带有model label -> deleted rows count的字典。 -
好吧,我想做的是,当我使用 .delete() 时,计数器会更新,因此当在管理员、shell 等中删除图像时,计数器会自动更新。
-
我使用的是 django 1.5
标签: django django-signals django-managers