Follow ReferenceFields in EmbeddedDocuments with select_related

For the following structure:

    class Playlist(Document):
        items = ListField(EmbeddedDocumentField("PlaylistItem"))

    class PlaylistItem(EmbeddedDocument):
        song = ReferenceField("Song")

    class Song(Document):
        title = StringField()

this patch prevents the N+1 queries otherwise required to fetch all
the `Song` instances referenced by all the `PlaylistItem`s.
This commit is contained in:
Clay McClure
2014-06-19 19:33:46 -04:00
parent 4e7b5d4af8
commit 170693cf0b
3 changed files with 28 additions and 3 deletions

View File

@@ -95,7 +95,7 @@ class DeReference(object):
# Recursively find dbreferences
depth += 1
for k, item in iterator:
if isinstance(item, Document):
if isinstance(item, (Document, EmbeddedDocument)):
for field_name, field in item._fields.iteritems():
v = item._data.get(field_name, None)
if isinstance(v, (DBRef)):
@@ -202,7 +202,7 @@ class DeReference(object):
if k in self.object_map and not is_list:
data[k] = self.object_map[k]
elif isinstance(v, Document):
elif isinstance(v, (Document, EmbeddedDocument)):
for field_name, field in v._fields.iteritems():
v = data[k]._data.get(field_name, None)
if isinstance(v, (DBRef)):