Abstract documents can now declare indexes

fixes #380
This commit is contained in:
Ross Lawley 2011-12-07 02:15:50 -08:00
parent e7bcb5e366
commit 3e2f035400
3 changed files with 37 additions and 2 deletions

View File

@ -5,6 +5,7 @@ Changelog
Changes in dev
==============
- Fixed Abstract documents can now declare indexes
- Added db_alias support to individual documents
- Fixed GridFS documents can now be pickled
- Added Now raises an InvalidDocumentError when declaring multiple fields with the same db_field

View File

@ -586,6 +586,7 @@ class TopLevelDocumentMetaclass(DocumentMetaclass):
collection = ''.join('_%s' % c if c.isupper() else c for c in name).strip('_').lower()
id_field = None
abstract_base_indexes = []
base_indexes = []
base_meta = {}
@ -605,6 +606,9 @@ class TopLevelDocumentMetaclass(DocumentMetaclass):
base_meta[key] = base._meta[key]
id_field = id_field or base._meta.get('id_field')
if base._meta.get('abstract', False):
abstract_base_indexes += base._meta.get('indexes', [])
else:
base_indexes += base._meta.get('indexes', [])
# Propagate 'allow_inheritance'
if 'allow_inheritance' in base._meta:
@ -651,8 +655,9 @@ class TopLevelDocumentMetaclass(DocumentMetaclass):
meta['queryset_class'] = manager.queryset_class
new_class.objects = manager
indicies = meta['indexes'] + abstract_base_indexes
user_indexes = [QuerySet._build_index_spec(new_class, spec)
for spec in meta['indexes']] + base_indexes
for spec in indicies] + base_indexes
new_class._meta['indexes'] = user_indexes
unique_indexes = cls._unique_with_indexes(new_class)

View File

@ -664,6 +664,35 @@ class DocumentTest(unittest.TestCase):
BlogPost.drop_collection()
def test_abstract_index_inheritance(self):
class UserBase(Document):
meta = {
'abstract': True,
'indexes': ['user_guid']
}
user_guid = StringField(required=True)
class Person(UserBase):
meta = {
'indexes': ['name'],
}
name = StringField()
Person.drop_collection()
p = Person(name="test", user_guid='123')
p.save()
self.assertEquals(1, Person.objects.count())
info = Person.objects._collection.index_information()
self.assertEqual(info.keys(), ['_types_1_user_guid_1', '_id_', '_types_1_name_1'])
Person.drop_collection()
def test_embedded_document_index(self):
"""Tests settings an index on an embedded document
"""