С помощью Django Websockets, как я могу подписать текущего пользователя на новую группу из файла views.py
В Django у меня есть models.py с Collection и Members в качестве отношения к ним:
# models.py
class Collection(models.Model):
name = models.CharField(max_length=100, null=False, blank=False)
class Member(models.Model):
account = models.ForeignKey(User, related_name="account_set", on_delete=models.CASCADE)
collection = models.ForeignKey(Collection, related_name='members', on_delete=models.CASCADE)
И у меня есть вебсокет для уведомления участников всякий раз, когда у нас есть изменения в коллекции, членом которой является пользователь. Для этого у меня есть MainConsumer, показанный ниже.
# consumers.py
class MainConsumer(WebsocketConsumer):
def connect(self):
user_id = self.scope['user_id']
collection_ids = Member.objects.filter(account_id=user_id).values_list("collection_id", flat=True)
for collection_id in collection_ids:
async_to_sync(self.channel_layer.group_add)(f'collection_ws_{collection_id}' , self.channel_name)
self.accept()
Работает как шарм. Я могу прекрасно общаться. Вопрос заключается в следующем:
Если я создаю новую коллекцию, мне нужно как-то сообщить моему MainConsumer, что запрашиваемый пользователь теперь должен получать уведомления и из этой новой коллекции.
# views.py
class CollectionCreate(generics.CreateAPIView):
permission_classes = [IsAuthenticated, ]
def create(self, request, *args, **kwargs):
collection = Collection.objects.create(name=request.data['name'])
# Create a member as admin
member = Member.objects.create(
collection=collection,
account=request.user,
)
** -- Here I want to 'subscribe' the current user to this new collection as well, but I cant figure out how... -- **
return JsonResponse({"payload": CollectionSerializer(collection, many=False).data
}, status=200)
Стоит упомянуть, что я могу "перезагрузить" свой вебсокет во фронтенде и он работает, но кажется немного странным делать это таким образом. Я видел некоторые подобные вещи на SO, и я считаю, что так и должно быть, но я не смог заставить это работать:
async_to_sync(get_channel_layer().group_add)(f'collection_ws_{collection.id}', channel_name) # but I do not even have access to channel_name