Обновление данных базы данных из вебсокета

Я хотел бы обновлять данные базы данных через веб-сокет. В частности, когда пользователь подключается к вебсокету, я хотел бы обновить поле в одной из моих моделей с меткой времени, когда пользователь подключился.

Однако, с логикой, которую я реализовал, я получаю эту ошибку:

Вот что я пробовал, это находится в моем consumers.py и является функцией, вызываемой, когда пользователь подключается к websocket:

class PracticeConsumer(AsyncWebsocketConsumer):
    async def websocket_connect(self, event):
        ...
        group_name = username_id
        result = (await self.update_timestamp(group_name))
        await self.channel_layer.group_add(
            '{}'.format(group_name),
            self.channel_name
        )
        await self.accept()
    ...
    @database_sync_to_async
    def update_timestamp(self, user_id):
        time = timezone.now().isoformat()
        request = dict({'method': 'PUT', 'connected_timestamp': time, 'user.id': self.user_id})
        serializer_class = UpdateProfileView(request)
        return User.objects.filter(user__id=user_id).values()

Вот как выглядит мой UpdateProfileView:

class UpdateProfileView(generics.UpdateAPIView):
    queryset = User.objects.all()
    serializer_class = UpdateUserSerializer
    def profile(request):
        if request.method == 'PUT':
            try:
                user = User.objects.get(id=request.user.id)
                serializer_user = UpdateUserSerializer(user, many=True)
                if serializer_user.is_valid():
                    serializer_user.save()
                    return Response(serializer_user)
            except User.DoesNotExist:
                return Response(data='no such user!', status=status.HTTP_400_BAD_REQUEST)

Ошибка связана с тем, что вам нужен self в функции UpdateProfileView profile, например: def profile(self, request):

Но! Из того, что я вижу, они обычно используют функцию update, а не profile

Пример
  • Также я обновил, чтобы использовать filter().first(), он будет возвращать None, если не найдет ни одного. Try/Catch - это отвратительно, имо
  • .
class UpdateProfileView(generics.UpdateAPIView):
    queryset = User.objects.all()
    serializer_class = UpdateUserSerializer
    def update(self, request, *args, **kwargs):
        if request.method == 'PUT':

            user = User.objects.filter(id=request.user.id).first()

            # # but `request.user` is a User Object!- You don't need to filter for it!
            # user = request.user

            if user:
                serializer_user = UpdateUserSerializer(user, many=True)
                if serializer_user.is_valid():
                    serializer_user.save()
                    return Response(serializer_user)
            else:
                return Response(data='no such user!', status=status.HTTP_400_BAD_REQUEST)python

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