Обновление данных базы данных из вебсокета
Я хотел бы обновлять данные базы данных через веб-сокет. В частности, когда пользователь подключается к вебсокету, я хотел бы обновить поле в одной из моих моделей с меткой времени, когда пользователь подключился.
Однако, с логикой, которую я реализовал, я получаю эту ошибку:
Вот что я пробовал, это находится в моем 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