2015-03-11 1 views
1

Могу ли я ограничить длину данных ListField в mongoengie без if состоянии?Предельная длина ListField в mongoengine

мне нужно что-то вроде этого:

list = db.ListField(IntField(), max_length = 24) 

в моем document.

Или я должен проверить длину моего списка, когда он будет обновлен, и не обновлять его, если длина моего списка больше 24!

ответ

3

Там нет ничего, как это встроенный в ListField, но вы можете сделать свой пользовательские ListField обеспечивая max_length атрибут:

class MyListField(ListField): 
    def __init__(self, max_length=None, **kwargs): 
     self.max_length = max_length 
     super(MyListField, self).__init__(**kwargs) 

    def validate(self, value): 
     super(MyListField, self).validate(value) 

     if self.max_length is not None and len(value) > self.max_length: 
      self.error('Too many items in the list') 
+0

Только от верхней части головы и не глядя прямо сейчас, но не могу [SortedListField ] (http://docs.mongoengine.org/en/latest/apireference.html#mongoengine.fields.SortedListField) можно применять с аргументами, которые эффективно выполняют [$ slice] (http://docs.mongodb.org/manual/ reference/operator/update/slice /) в соответствии с обычными операциями массива MongoDB? Кажется, я смутно помню тестовый пример. Но если вы можете подтвердить, что это не так, то здорово. –

+0

wow Я не думаю о пользовательском Listfield, который кажется отличным , но я не могу понять какой-то синтаксис, например '** kwargs' и' super' и 'validate' функции не могли бы вы рассказать мне о них? – MDK

+1

@MDK уверен, 'супер (MyListField, self) .__ init __ (** kwargs)' будет вызывать метод '__init __()' ListField' (см. Http://stackoverflow.com/questions/576169/understanding- python-super-with-init-methods), говоря о '** kwargs' - см. http://stackoverflow.com/questions/1769403/understanding-kwargs-in-python. 'Field.validate()' метод является базовым методом проверки для полей mongoengine, см., Например, как реализуется «StringField». Надеюсь, это поможет. – alecxe