С помощью 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
Вернуться на верх