2013-10-04 4 views
0

я следующий класс SQLAlchemy определены:SQLAlchemy - значения маски в объекты на лету

Base = sqlalchemy.ext.declarative.declarative_base() 
class NSASecrets(Base): 
    __tablename__ = 'nsasecrets'; 
    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True); 
    text = sqlalchemy.Column(sqlalchemy.String); 
    author = sqlalchemy.Column(sqlalchemy.String); 

Теперь то, что я хочу сделать, это быть в состоянии «автора» поле маски в зависимости от некоторой логики, что-то вроде :

if (allowed): 
    nsasecrets = session.query(NSASecrets,**mask=False**); 
else: 
    nsasecrets = session.query(NSASecrets,**mask=True**); 
for nsasecret in nsasecrets: 
    print '{0} {1}'.format(author, text); 

Поэтому в зависимости от этого параметра «маска» Я хотел бы вывод, что «Джон Смит» в ложном случае - выход не маскируется, или «J *** * * ч», когда выход маскируется , Теперь, очевидно, я мог бы сделать это в этой самой печати, но проблема в том, что отпечатки разбросаны по всему коду, и единственный способ сделать это контролируемым централизованным образом - создать объекты SQLAlchemy с уже замаскированными значениями. Итак, есть ли хорошо известное решение этого? Или я должен просто создать свой собственный диспетчер сеансов, который перегрузит интерфейс «запроса», или я пропустил некоторые другие возможные решения?

Благодаря

+0

'nsasecret.author' и' nsasecret.text' должно быть. В 'format' –

+0

и это только атрибут' author'? –

ответ

1

обычно это такая вещь, в Python мы делаем что-то под названием descriptors. Простым способом объединения дескрипторов с сопоставленными столбцами SQLAlchemy является использование synonym, хотя синоним немного устарел на этом этапе, в пользу менее «магической» системы, называемой hybrids. Любой из них может быть использован здесь, ниже приведен пример гибрида:

from sqlalchemy import * 
from sqlalchemy.orm import * 
from sqlalchemy.ext.declarative import declarative_base, synonym_for 
from sqlalchemy.ext.hybrid import hybrid_property 

Base = declarative_base() 

class NSASecrets(Base): 
    __tablename__ = 'nsasecrets' 

    id = Column(Integer, primary_key=True) 
    _text = Column("text", String) 
    _author = Column("author", String) 

    def _obfuscate(self, value): 
     return "%s%s" % (value[0], ("*" * (len(value) - 2))) 

    @hybrid_property 
    def text(self): 
     return self._obfuscate(self._text) 

    @text.setter 
    def text(self, value): 
     self._text = value 

    @text.expression 
    def text(cls): 
     return cls._text 

    @hybrid_property 
    def author(self): 
     return self._obfuscate(self._author) 

    @author.setter 
    def author(self, value): 
     self._author = value 

    @author.expression 
    def author(cls): 
     return cls._author 

n1 = NSASecrets(text='some text', author="some author") 

print n1.text 
print n1.author 

отмечает, что это не имеет много общего с запросами. Идея форматирования данных по мере поступления в наборе строк - это другой способ пойти, и есть способы сделать это тоже, хотя, если вас беспокоят только утверждения печати, которые относятся к «текст» и «автор», вероятно, более удобно сохранять это как шаблон доступа к python.

Смежные вопросы