Настойка sqlalchemy сохранить список как json - PullRequest
0 голосов
/ 30 июня 2018

Я использую эту модель в Flask-rest с sqlalchemy в python3.5

class UserModel(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(255), unique=True, nullable=False)
    password = db.Column(db.String(600), nullable=False)
    roles = db.Column(db.String(255), nullable=False)

Я хочу сохранить в ролях строку в json со списком строк (ролей). Я хотел бы получить доступ к этому атрибуту, как если бы это был список Python, а не строка (но сохранить его в базе данных как строку, список JSON).

Недопустимые варианты:

1) Я мог бы выполнить преобразование из базы данных и в нее с использованием методов получения и установки, но это не то, что я ищу. Странно обращаться к каждому атрибуту напрямую, за исключением ролей с геттерами и сеттерами.

2) Установите связь с другой таблицей ролей. Я хочу, чтобы количество столов было минимальным.


Есть ли способ добавить метод / что-то, чтобы добавить этот процесс автоматического преобразования из и в json при извлечении и сохранении в базе данных?

1 Ответ

0 голосов
/ 30 июня 2018

Как насчет использования гибридного свойства ?

import json
from sqlalchemy.ext.hybrid import hybrid_property

class UserModel(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(255), unique=True, nullable=False)
    password = db.Column(db.String(600), nullable=False)
    _roles = db.Column('roles', db.String(255), nullable=False, default='[]', server_default='[]')

@hybrid_property
def roles(self):
    return json.loads(self._roles)

@roles.setter
def roles(self, roles):
    self._roles = json.dumps(roles)

Редактировать: добавлены изменения, предложенные @ monstercode

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...