Получить старые объекты, обновить, а затем вернуть старые объекты
У меня есть APIView
, который выглядит следующим образом:
class GetNotifications(ListAPIView):
serializer_class = NotificationSerializer
def get_queryset(self):
notifications = Notification.objects.select_related().filter(user=self.request.user).order_by("-created_at")
Notification.objects.select_for_update().filter(is_read=False, user=self.request.user).update(is_read=True)
return notifications
Я пытаюсь получить все уведомления, которые есть у пользователя. Они включают уведомления, которые были прочитаны и которые еще не были прочитаны (отсюда поле is_read). Я хотел бы вернуть как is_read
, так и не is_read
уведомления. Как только эти объекты будут получены, произойдет обновление, чтобы изменить не прочитанные уведомления на прочитанные. Это означает, что любой пользователь, обращающийся к этому API через сайт, будет считать, что он прочитал свои уведомления, и мы сможем установить is_read=True
... Однако мой текущий код возвращает объекты после их обновления. Я хочу возвращать старые объекты до обновления, следовательно, я назначаю уведомления старым объектам до обновления. Я полагаю, что это связано с ленивой загрузкой со стороны Django. Есть ли способ/лучший способ решить эту проблему?
однако, мой текущий код возвращает объекты после их обновления. Я хочу возвращать старые объекты до обновления, следовательно, я назначаю уведомления старым объектам до обновления. Я полагаю, что это связано с ленивой загрузкой со стороны Django. Есть ли способ/лучший способ решить эту проблему?
Он все равно вернет обновленные объекты, поскольку запрос будет, если вообще будет, оценен после обновления, и, следовательно, в это время
is_read
уже будет установлен вTrue
.Вы должны "материализовать" кверисет, то есть принудительно загрузить его в память. Например, вызывая
list(…)
на нем:class GetNotifications(ListAPIView): serializer_class = NotificationSerializer def get_queryset(self): notifications = ( Notification.objects.select_related() .filter(user=self.request.user) .order_by('-created_at') ) list(notifications) Notification.objects.filter(user=self.request.user).update(is_read=True) return notifications