Как удалить данные после выборки в одном и том же действии в Django?

У меня есть таблица в DB с именем Plan. см. код в models.py:

class Plan(models.Model):
    id = models.AutoField(primary_key=True)
    Comments = models.CharField(max_length=255)
    def __str__(self):
        return self.Comments

Я хочу получить данные (комментарии) из БД и после этого данные будут удалены. То есть данные будут получены один раз. И эти данные будут показаны в шаблоне Django. Я пробовал, см. views.py

def Data(request):
    data =  Plan.objects.filter(id=6)
    # latest_id = Model.objects.all().values_list('id', flat=True).order_by('-id').first()
    # Plan.objects.all()[:1].delete()    
    context = {'data':data}
    dataD =  Plan.objects.filter(id=6)
    dataD.delete()
    return render(request,'data.html',context)

Этот код удаляет данные из БД, но не отображается в шаблоне. Как я могу это сделать?

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

Из документации django:

Pickling QuerySets¶

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

Если вы хотите сохранить только необходимую информацию для воссоздания QuerySet из базы данных в более позднее время, сохраните атрибут запроса QuerySet. Затем вы можете воссоздать исходный QuerySet (без загрузки результатов) с помощью следующего кода:


>>> import pickle
>>> query = pickle.loads(s)     # Assuming 's' is the pickled string.
>>> qs = MyModel.objects.all()
>>> qs.query = query            # Restore the original 'query'.

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