From f15efc09301c301184923bcb49cb8b64816a14b2 Mon Sep 17 00:00:00 2001 From: Tyson Clugg Date: Fri, 25 Sep 2015 11:30:48 +1000 Subject: [PATCH] Use select_related() and resultant cached relational fields to speed up Colleciton.serialize(). --- dddp/api.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dddp/api.py b/dddp/api.py index 0cabe85..189aac4 100644 --- a/dddp/api.py +++ b/dddp/api.py @@ -404,9 +404,11 @@ class Collection(APIMixin): for field in meta.local_fields: rel = getattr(field, 'rel', None) if rel: + # use field value which should set by select_related() fields[field.column] = get_meteor_id( - rel.to, fields.pop(field.name), + getattr(obj, field.name), ) + fields.pop(field.name) elif isinstance(field, django.contrib.postgres.fields.ArrayField): fields[field.name] = field.to_python(fields.pop(field.name)) elif ( @@ -642,7 +644,7 @@ class DDP(APIMixin): meteor_ids = get_meteor_ids( qs.model, qs.values_list('pk', flat=True), ) - for obj in qs: + for obj in qs.select_related(): payload = col.obj_change_as_msg(obj, ADDED, meteor_ids) this.send(payload) if not silent: