Редактировать: Я хотел бы смоделировать 1 to 0:1
отношение между User
и Comment
(у пользователя может быть ноль или один комментарий).Вместо доступа к объекту Comment
я бы предпочел непосредственно получить доступ к самому комментарию.Использование SQLAlchemys association_proxy
идеально подходит для этого сценария , за исключением , с одной стороны: доступ к User.comment
до связывания Comment
.Но в этом случае я предпочел бы ожидать None
вместо AttributeError
в качестве результата.
Посмотрите на следующий пример:
import sqlalchemy as sa
import sqlalchemy.orm as orm
from sqlalchemy import Column, Integer, Text, ForeignKey, Table
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.associationproxy import association_proxy
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(Text)
def __init__(self, name):
self.name = name
# proxy the 'comment' attribute from the 'comment_object' relationship
comment = association_proxy('comment_object', 'comment')
class Comment(Base):
__tablename__ = 'comments'
id = Column(Integer, primary_key=True)
comment = Column('comment', Text, nullable=False, default="")
user_id = Column(ForeignKey('users.id'), nullable=False, unique=True)
# user_id has to be unique to ensure that a User can not have more than one comments
def __init__(self, comment):
self.comment = comment
user_object = orm.relationship(
"User",
uselist=False, # added after edditing the question
backref=orm.backref('comment_object', uselist=False)
)
if __name__ == "__main__":
engine = sa.create_engine('sqlite:///:memory:', echo=True)
Session = orm.sessionmaker(bind=engine)
Base.metadata.create_all(engine)
session = Session()
Теперь следующий код выдает AttributeError
:
u = User(name="Max Mueller")
print u.comment
Как лучше всего перехватить это исключение и указать вместо него значение по умолчанию (например, пустую строку)?