fix: select_for_update error for out join sql

This commit is contained in:
Bai 2024-06-13 15:49:28 +08:00
parent 2a33337963
commit e40c66c7ed

View File

@ -189,18 +189,15 @@ class SessionViewSet(RecordViewLogMixin, OrgBulkModelViewSet):
return Response({'msg': 'ok', 'id': activity_log.id}) return Response({'msg': 'ok', 'id': activity_log.id})
def get_queryset(self): def get_queryset(self):
queryset = super().get_queryset() \ queryset = super().get_queryset()
.prefetch_related('terminal') \ if self.request.method in ('GET',):
.annotate(terminal_display=F('terminal__name')) queryset = queryset.prefetch_related('terminal').annotate(terminal_display=F('terminal__name'))
return queryset elif self.request.method in ('PATCH',):
# postgres reports an error for statements that use select_for_update for out join
def filter_queryset(self, queryset): # so we need to use select_for_update only for have not prefetch_related and annotate
queryset = super().filter_queryset(queryset)
# 解决guacamole更新session时并发导致幽灵会话的问题暂不处理
if self.request.method in ('PATCH',):
queryset = queryset.select_for_update() queryset = queryset.select_for_update()
return queryset return queryset
def perform_create(self, serializer): def perform_create(self, serializer):
if hasattr(self.request.user, 'terminal'): if hasattr(self.request.user, 'terminal'):
serializer.validated_data["terminal"] = self.request.user.terminal serializer.validated_data["terminal"] = self.request.user.terminal