Django — остановить синхронизацию между различными переменными на основе фильтров для одного и того же объекта

#python #django #python-3.x

#python #django #python-3.x

Вопрос:

Извините за запутанный вопрос, не уверен, как его правильно описать.

Допустим, у меня есть модель с именем News , переменная news будет использоваться для хранения результатов фильтрации непрочитанных News с атрибутом read=False и пометьте их news на read=True , затем верните их news в template. Проблема в том, что после обновления read=True исходная переменная, news которая должна хранить исходное непрочитанное news , станет пустой. Какие методы стоят за этим и как остановить эту синхронизацию?

Пример кода:

 class News(models.Model):
    ...
    read = models.BooleanField(default=False)

def foo(self):
    news = News.object.filter(read=False) # get un-read news correctly
    news.update(read=True) # update stored news successfully, but news will become empty

    return news # return empty news instead of original filter result
  

Спасибо за ваши ответы.

Ответ №1:

Потому что наборы запросов являются ленивыми. Результаты не оцениваются до тех пор, пока вы фактически не выполните итерацию по набору запросов, что в вашем коде предположительно происходит в шаблоне.

Вы могли бы сначала преобразовать в список:

 news_to_read = list(news)
news.update(read=True)
return news_to_read
  

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

Комментарии:

1. Спасибо за ваш ответ и супер полезную ссылку, отлично решил мою проблему.