Создайте модель из YAML / JSON на лету - PullRequest
9 голосов
/ 11 июня 2011

Я пробую MongoEngine , библиотеку DRM для Python для использования с MongoDB. Я могу определить модель, как этот пример с сайта:

class User(Document):
    email = StringField(required=True)
    first_name = StringField(max_length=50)
    last_name = StringField(max_length=50)

Это работает как шарм, и MongoEngine действительно хорош. Что ж, я хочу пойти дальше и подумать, могу ли я определить свои модели где-нибудь в файле в формате JSON или YAML, или что-то еще, чтобы затем создать модель, используя ее. Таким образом, это объявление может выглядеть следующим образом в JSON:

{
    "model":"User",
    "fields":{
        "email":{
            "type":"string",
            "required":"true"
        },
        "first_name":{
            "type":"string",
            "max_length":"50"
        },
        "last_name":{
            "type":"string",
            "max_length":"50"
        }
    }
}

Тогда я бы проанализировал этот JSON и создал модель, используя его. Может быть, это может быть просто одна операция импорта, которую я буду выполнять каждый раз, когда я изменяю определение модели, или может быть, это может каждый раз анализировать весь JSON. Это хороший сценарий? Я просто хочу позволить людям, которые будут использовать приложение, определять свои собственные модели, не копаясь в коде. Любые идеи, как сделать создание динамической модели приветствуются

1 Ответ

5 голосов
/ 11 июня 2011

Если вы собираетесь использовать YAML, pyyaml ​​ абсолютно безболезнен и автоматически выводит структуру данных, используя встроенные типы Python (или даже более сложные типы, которые вы определяете).

В любом случае, я бы настоятельно рекомендовал Rx в качестве средства проверки, чтобы вы могли легко проверить целостность загруженных файлов. *

Что касается использования этого для создания модели, вы можете использовать встроенную функцию type (не type(object), а type(name, bases, dict)), которая ... "[r] переворачивает новую Тип объекта. По сути, это динамическая форма оператора класса. "

Итак, вы можете позвонить:

def massage(fields_dict):
    #transform your file format into a valid set of fields, and return it

user_class = type(yaml_data['model'], Document, massage(yaml_data['fields']) )

* Я использовал оба из них вместе за последние восемь часов, по совпадению - они работают безболезненно, например ::

import yaml
import Rx

data = yaml.load(open("foo.yaml")
rx = Rx.Factory({ "register_core_types": True })
schema = rx.make_schema(yaml.load(open("schema.yaml")))

if not schema.check(data):
    raise ValueError("data file contents are not in a valid format")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...