Невозможно удалить старые объекты после добавления нового в django

old_objs = MyModel.objects.filter(user=request.user)
MyModel.objects.create(user=request.user,...)# I must have to keep this line here. Because the new object is related to old objects
old_objs.delete()

У меня есть модель с именем MyModel. Я отфильтровал некоторые старые объекты и сохранил их в переменной

добавьте новый объект.

Теперь, если я хочу удалить old_objs, он удалит все объекты, включая новый объект.

Я хочу сохранить новый объект и удалить старые объекты.

Вы видите такое поведение, поскольку old_objs является кверисетом, а .delete() делает DELETE FROM ... WHERE user = ... без загрузки всех объектов.

Вы можете сделать, например,

old_objs = MyModel.objects.filter(user=request.user)
new_instance = MyModel.objects.create(user=request.user,...)
old_objs.exclude(pk=new_instance.pk).delete()

чтобы исключить только что созданный объект, но это будет иметь неожиданные последствия при одновременном обновлении.

Возможно, вам лучше использовать транзакции, так что если создание не удастся, удаление будет откатано и, таким образом, не произойдет.

with transaction.atomic():
    MyModel.objects.filter(user=request.user).delete() 
    MyModel.objects.create(user=request.user, ...)

Как отмечается в ответе, old_objs является кверисетом и оценивается не при его создании, а при использовании.

Альтернативным ответом является принудительная оценка:

eg.

len(old_objs)

или

for obj in old_objs:
    pass

Сделайте это до создания нового экземпляра, и вы получите желаемое поведение.

Если вы делаете много других вещей и добавляете фильтры и т.д., не делайте этого, так как вы будете многократно ударять по БД. Не очень хорошо. Если ваш код буквально такой, как в вопросе, добавление оценки len непосредственно после создания qs должно помочь.

Вернуться на верх