Это небольшая функция для удаления объекта. Я хотел бы спросить, как работает instance.get_another_url (), даже если экземпляр был удален? - PullRequest
0 голосов
/ 19 декабря 2018
def post_delete(request,id):

    instance= get_object_or_404(Post , id=id)
    instance.delete()
    messages.success(request , "Post deleted!")
    return HttpResponseRedirect(instance.get_another_url())     

1 Ответ

0 голосов
/ 19 декабря 2018

Когда вы вызываете Model.delete(), он удалит строку из базы данных, однако это не удалит ваш текущий экземпляр из памяти.В этом случае get_another_url работает, потому что вы все равно можете получить доступ к атрибутам, которые были кэшированы в экземпляре.

Если вы должны были получить экземпляр из QuerySet, который использовал .only(...) или .defer(...) (что задерживает извлечение полей более ленивым способом, а не все поля в модели, которые извлекаются сразу), тогда вы, скорее всего, столкнетесь с некоторой ошибкой при попытке извлечь оставшиеся поля избаза данных.

queryset = QuerySet.objects.filter().only("one_field")  # Will only retrieve id and one_field column from database
instance = queryset.first()
instance.delete()
instance.another_field  # Raises DatabaseError
...