From 9df725165beca247340fcee7f2858fdaa64107a6 Mon Sep 17 00:00:00 2001 From: Florian Schlachter Date: Fri, 14 May 2010 13:35:45 +0200 Subject: [PATCH] =?UTF-8?q?Added=20a=20possibility=20to=20define=20a=20bas?= =?UTF-8?q?e=20class=20for=20fields=20from=20a=20DictField=20(instead=20of?= =?UTF-8?q?=20using=20BaseField).=20This=20is=20important=20if=20you=20wan?= =?UTF-8?q?t=20to=20use=20field-based=20query=20abilities=20like=20StringF?= =?UTF-8?q?ield's=20startswith/endswith/contains.=20Just=20define=20`basec?= =?UTF-8?q?ls=C2=B4=20when=20defining=20your=20DictField.=20Example:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit class Test(Document): name = StringField() translations = DictField(basecls=StringField) Without basecls defined: > Test.objects(translations__german__startswith='Deutsch') [] With basecls set to StringField: > Test.objects(translations__german__startswith='Deutsch') [] --- mongoengine/fields.py | 7 ++++++- mongoengine/queryset.py | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/mongoengine/fields.py b/mongoengine/fields.py index 55e5addb..75008d6f 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -348,6 +348,11 @@ class DictField(BaseField): .. versionadded:: 0.3 """ + def __init__(self, basecls=None, *args, **kwargs): + self.basecls = basecls or BaseField + assert issubclass(self.basecls, BaseField) + super(DictField, self).__init__(*args, **kwargs) + def validate(self, value): """Make sure that a list of valid fields is being used. """ @@ -360,7 +365,7 @@ class DictField(BaseField): 'contain "." or "$" characters') def lookup_member(self, member_name): - return BaseField(db_field=member_name) + return self.basecls(db_field=member_name) class GeoLocationField(DictField): """Supports geobased fields""" diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index 396a745c..11b5321a 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -313,7 +313,7 @@ class QuerySet(object): op = None if parts[-1] in operators + match_operators: op = parts.pop() - + if _doc_cls: # Switch field names to proper names [set in Field(name='foo')] fields = QuerySet._lookup_field(_doc_cls, parts)