Способы перебора всех полей в mongoengine Документируйте и проверяйте, является ли каждое поле определенным типом и is_required

Вот какое-то поле в документе с использованием mongoengine

_id     = f.ObjectIdField(db_field="i", required=True)
name    = f.StringField(db_field="n")

Я хотел бы просмотреть каждое поле в документе и посмотреть, являются ли они типом XField, а is_required - True, есть ли способ сделать это?

Я знаю, что вы можете перечислить все поля, используя _fields

но

for field in SomeDocument._fields:
    print type(field) # always return 'str' not 'StringField' or 'ObjectField'

    # Don't know how to check is_required

Любая помощь будет оценена по достоинству.


person Kevin    schedule 17.06.2015    source источник


Ответы (2)


Вы можете просто использовать это

field_dict = SomeDocument.get_fields_info()
for field_name, field in field_dict.iteritems():
    print field_name, field.required, field.__class__
person Rajesh Kaushik    schedule 29.06.2015

Проблема, с которой вы столкнулись, заключается в том, что SomeDocument._fields является словарем, поэтому итерация по нему дает вам ключи (которые являются строками). Например, если у вас есть поле foo, вы можете сделать SomeDocument._fields['foo'].required. И, конечно, вы можете сделать что-то вроде:

for field in SomeDocument._fields:
    print '{} {} required.'.format(SomeDocument._fields[field], 'is' if SomeDocument._fields[field].required else 'is not')
person jimjkelly    schedule 03.01.2017