通过SqlAlchemy模型类定义中的@property进行Python获取和设置:HOWTO

发布于 2021-01-29 16:35:29

因此,我对sqlalchemy和ORM非常陌生。我有一个现有的数据库postgresql,并且已经创建了一个与数据库进行通信的模型。下面是我的Transcribers表的类。通过它进行查询时,所有这些都可以工作。我在设置类中的获取器和设置器时遇到问题。

class Transcriber(Base):
    __tablename__ = 'transcribers'
    __table_args__ = (
    UniqueConstraint('projectid', 'email'),
    )

    transcriberid = Column(Integer, primary_key=True, server_default=text("nextval('transcribers_transcriberid_seq'::regclass)"))
    projectid = Column(ForeignKey(u'projects.projectid', ondelete=u'CASCADE'), index=True)
    email = Column(Text, nullable=False)
    created = Column(DateTime, nullable=False, server_default=text("now()"))
    onwebsite = Column(Boolean, nullable=False, server_default=text("true"))

    def __repr__(self):
        return "<Transcriber(transcriberid:'%s', projectID:'%s', email:'%s', created:'%s', onwebsite:'%s'" \
        %(self.transcriberid, self.projectid, self.email, self.created,   self.onwebsite)

    @property
    def transcriberid(self):
        return self.transcriberid

    def email(self):
        return self.email

    @email.setter
    def email(self, value):
        self.email = value

    project = relationship(u'Project')

我不确定如何使用@property方法访问对象内的不同变量。我想使用这种方法,因为我相信它更具Python感。

因此,现在我该如何实际调用这些方法了。并且它们设置正确。

我开始上课时收到此错误

Traceback (most recent call last):
File "./test.py", line 4, in <module>
   from peraAPI import DBSession, getProjectbyId, getTransById
     File "/Users/tcrha/bin/working/PeraPera/peraAPI/__init__.py", line 7, in <module>
from model_local import Project, Transcriber
  File "/Users/tcrha/bin/working/PeraPera/peraAPI/model_local.py", line 110, in <module>
class Transcriber(Base):
  File "/Users/tcrha/bin/working/PeraPera/peraAPI/model_local.py", line 133, in      Transcriber
@email.setter
AttributeError: 'function' object has no attribute 'setter'
关注者
0
被浏览
46
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以使用hybrid_property。在这种情况下,代码的简化版本应如下所示:

    from sqlalchemy.ext.hybrid import hybrid_property
    
    class Transcriber(Base):
        __tablename__ = 'transcribers'
        __table_args__ = (
        UniqueConstraint('projectid', 'email'),
        )
    
        transcriberid = Column(Integer, primary_key=True, server_default=text("nextval('transcribers_transcriberid_seq'::regclass)"))
        projectid = Column(ForeignKey(u'projects.projectid', ondelete=u'CASCADE'), index=True)
        created = Column(DateTime, nullable=False, server_default=text("now()"))
        onwebsite = Column(Boolean, nullable=False, server_default=text("true"))
    
        _email = Column('email', Text, nullable=False)
    
        @hybrid_property
        def email(self):
            return self._email
    
        @email.setter
        def email(self, email):
            self._email = email
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看