Added a possibility to define a base class for fields from a DictField (instead of using BaseField). This is important if you want to use field-based query abilities like StringField's startswith/endswith/contains. Just define `basecls´ when defining your DictField. Example:
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')
[<Test: Test object>]
			
			
This commit is contained in:
		@@ -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"""
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user