Создайте объект dict / json из таблицы «многие ко многим» - PullRequest
0 голосов
/ 23 октября 2018

Переходя от моего последнего вопроса.Я определил хорошо структурированное отношение «многие ко многим» между 3 таблицами.Я могу просто добавить пользовательскую ассоциацию, подобную этой

def setUserAssociation(**kwargs):
    associations = {}
    assoc = UserDevices() #Table object that stores all associations (see my last question)
    try:
        for table in kwargs:
            validTables = ["Site", "User", "Device", "Role"]
            if table not in validTables:
                raise ValueError("Unknown table `" + table + "` must be " + str(validTables))
            associations[table] = db.session.query(eval(k)).filter(eval(table).name==kwargs[table]).first()
            if associations[table] is None:
                raise ValueError("No " + table + " found with name `" + str(kwargs[table]) + "`")
            setattr(assoc, table .lower(), associations[table])
        db.session.add(assoc)
        db.session.commit()
        return SqlResponse(200, "Success")
    except Exception as e:
        print(e)
        return SqlResponse(500, str(e))

Наконец добавить пользователя Anum на сайте myHome и назначить ему owner Роль на устройстве myPlug

response = setUserAssociation(Site="myHome", User="Anum", Device="myPlug", Role="owner")

Достаточно хорошо!Теперь предположим, что у меня сложная таблица, структурированная как показано ниже:

enter image description here

Я хочу структурировать эту таблицу как объект Json или Dict.Я могу получить User Accociation List (UserDevice тип объекта), когда я вызываю getUserAssociation

def getUserAssociation(userName):
    user = db.session.query(User).filter(User.name == userName).first()
    return user.user_devices

userAssoc = getUserAssociation("Anum")
for u in userAssoc:
    print ("data: ", u.user.name, u.site.name, u.device.name, u.role.name)

Это дает мне список объектов UserDevice (для каждой строки).Конечно, я могу сделать свой собственный дикий метод, который создает json (как показано ниже) из вышеприведенных данных, НО ... есть ли другой простой способ сделать это?Может быть, SqlAlchemy уже предоставляет один?

{
    "sites": [
        {
            "site": "myHome",
            "devices": [
                {
                    "device": "plug",
                    "users": [
                        "{'user': 'John', 'role': 'owner'}",
                        "{'user': 'Steve', 'role': 'writer'}"
                    ]
                },
                {
                    "device": "fan",
                    "users": [
                        "{'user': 'Henry', 'role': 'manager'}",
                        "{'user': 'John', 'role': 'owner'}"
                    ]
                }
            ]
        }
    ]
}
...