У меня есть следующие модели:Джанго - Выполнение QuerySet задачи уровня, прежде чем удалить
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()
Спасибо!
Edit 1:
Я только что заметил изъян на то, что я хочу сделать. Я предполагал, что удаленные изображения принадлежат к одной и той же камере, однако, если они не из одной камеры, этот подход не будет работать. Единственный способ добиться того, что я хочу, будет в слушателе, я думаю ...
ли это произойдет на уровне модели? Может ли это произойти, когда вы удаляете изображения в пакетном режиме? Или я должен спросить, как удалить изображения? –
Какую версию Django вы используете? [Начиная с 1.9 'delete'] (https://docs.djangoproject.com/en/1.9/ref/models/querysets/#delete) возвращает словарь с меткой' model label -> deleted rows count'. – Ivan
Ну, что я хочу сделать, так это то, что когда я использую .delete(), счетчик обновляется, поэтому, когда изображение удаляется либо в админе, в оболочке и т. Д., Счетчик автоматически обновляется. – Agey