Получить старые объекты, обновить, а затем вернуть старые объекты

У меня есть 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
Вернуться на верх