Hi,

I have setup Django channels to fetch `messages` from a given `room`. 
However, I would like to change this logic to receive messages from several 
rooms. In DRF, I use serializers for this. I saw some for loops doing this, 
but I believe it is very inefficient.

What is the correct way to do this with a socket?

Also, I'd like the initial `ws_connect` to of course fetch any static 
result that exist already (currently this works, but only for a single 
`room`).

Ideally, my result would come like this:

# *Desired result*

[
    {
        "label": "Foo",
        "pk": 1,
        "message": [
            {
                "handle": "Bruce",
                "message": 1
            },
            {
                "handle": "Sol",
                "message": 2
            }
        ]
    },
    {
        "label": "Bar",
        "pk": 2,
        "message": [
            {
                "handle": "Sol",
                "message": 1
            },
            {
                "handle": "Alfred",
                "message": 2
            }
        ]
    }
]


FYI, here are my connect & receive models

# consumers.py

def ws_connect(message):
    prefix, label = message['path'].strip('/').split('/')
    # temporarily just getting the room from URL
    room = Room.objects.get(label=label)
    # multiroom = Room.objects.all()
    chathistory = room.messages.all().order_by('timestamp')
    Group('chat-' + label).add(message.reply_channel)
    message.channel_session['room'] = room.label
    message.reply_channel.send({'text': json.dumps([msg.as_dict() for msg in 
chathistory.all()])})


@channel_session
def ws_receive(message):
    label = message.channel_session['room']
    room = Room.objects.get(label=label)
    data = json.loads(message['text'])
    m = room.messages.create(handle=data['handle'], message=data['message'])
    Group('chat-'+label).send({'text': json.dumps([m.as_dict()])})




# models.py


class Room(models.Model):
    name = models.TextField()
    label = models.SlugField(unique=True)

class Message(models.Model):
    room = models.ForeignKey(Room, related_name='messages')
    handle = models.TextField()
    message = models.TextField()
    timestamp = models.DateTimeField(default=timezone.now, db_index=True)
    def __unicode__(self):
        return '[{timestamp}] {handle}: {message}'.format(**self.as_dict())


    @property
    def formatted_timestamp(self):
        return self.timestamp.strftime("%H:%M:%S")
    
    def as_dict(self):
        return {'pk':self.pk, 'handle': self.handle, 'message': self.message
, 'timestamp': self.formatted_timestamp}




Thanks

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/ab372b04-2507-4a18-8e31-acb0c6691b09%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to