Fix derefcence failed some case.

This commit is contained in:
Анхбаяр Лхагвадорж 2012-02-02 18:33:12 +08:00
parent 088f229865
commit 4a9ed5f2f2
3 changed files with 41 additions and 3 deletions

View File

@ -339,7 +339,7 @@ class ComplexBaseField(BaseField):
# _types / _cls data so make it a generic reference allows
# us to dereference
meta = getattr(v, 'meta', getattr(v, '_meta', {}))
if meta and not meta['allow_inheritance'] and not self.field:
if meta and not meta.get('allow_inheritance', True) and not self.field:
from fields import GenericReferenceField
value_dict[k] = GenericReferenceField().to_mongo(v)
else:

View File

@ -1,7 +1,7 @@
import pymongo
from base import (BaseDict, BaseList, TopLevelDocumentMetaclass, get_document)
from fields import ReferenceField
from fields import (ReferenceField, ListField, DictField, MapField)
from connection import get_db
from queryset import QuerySet
from document import Document
@ -102,7 +102,7 @@ class DeReference(object):
for key, doc in references.iteritems():
object_map[key] = doc
else: # Generic reference: use the refs data to convert to document
if doc_type:
if doc_type and not isinstance(doc_type, (ListField, DictField, MapField,) ):
references = doc_type._get_db()[col].find({'_id': {'$in': refs}})
for ref in references:
doc = doc_type._from_son(ref)

View File

@ -783,3 +783,41 @@ class FieldTest(unittest.TestCase):
root = root.reload()
self.assertEquals(root.children, [company])
self.assertEquals(company.parents, [root])
def test_dict_in_dbref_instance(self):
class Person(Document):
name = StringField(max_length=250, required=True)
meta = { "ordering" : "name" }
class Room(Document):
number = StringField(max_length=250, required=True)
staffs_with_position = ListField(DictField())
meta = { "ordering" : "number" }
Person.drop_collection()
# 201
bob = Person.objects.create(name='Bob')
bob.save()
keven = Person.objects.create(name='Keven')
keven.save()
sarah = Person.objects.create(name='Sarah')
sarah.save()
room_201 = Room.objects.create( number = "201")
room_201.staffs_with_position = [ {'position_key': 'window', 'staff' : sarah.to_dbref() },
{ 'position_key': 'door', 'staff': bob.to_dbref() },
{ 'position_key': 'center' , 'staff' : keven.to_dbref() } ]
room_201.save()
room = Room.objects.first().select_related()
room.to_mongo()