nonSQL相关属性添加到SQLAlchemy模型错误

时间:2017-02-07 23:33:45

标签: python postgresql class flask sqlalchemy

我正在使用python和flask开发一个Web应用程序。我使用Flask,SQLAlchemy和PostgreSQL进行开发。我有多对一的相关模型。通过这种模式,一家公司可以拥有许多用户,但每个用户只能拥有一家公司。

models.py
class Company(ResourceMixin, db.Model):
    __tablename__ = 'companies'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), unique=True, index=True, 
                     nullable=False, server_default='')
    phone = db.Column(db.String(24)) 
    email = db.Column(db.String(255), index=True)
    address = db.Column(db.String(255))

    # Relations
    users = db.relationship('User', backref='company')

class User(UserMixin, ResourceMixin, db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)

    # User details
    name = db.Column(db.String(50), index=True)
    phone = db.Column(db.String(24)) 
    address = db.Column(db.String(255))
    email = db.Column(db.String(255), unique=True, index=True, nullable=False,
                      server_default='')
    password = db.Column(db.String(128), nullable=False, server_default='')

    # Relations
    company_id = db.Column(db.Integer, db.ForeignKey('companies.id', 
                                                     onupdate='CASCADE',
                                                     ondelete='SET NULL'), 
                           index=True)


views.py
app.route('/')
def index():
    company = Company.query.get(1)
    flash(company.name, company.user_count)
    return render_template('index.html')

错误摘要:“user_count”属性不属于公司模型。

我想从公司模型中动态获取用户数。属性应该在每次调用模型时对用户进行计数,并在常规属性(如company.user_count)上提供。我是通过创建一个类方法并在视图函数中调用它来实现的,但我希望它能在不使用属性之前调用方法的情况下自动生成进程。

我尝试了 init 这样的功能:

def __init__(self):
    self.user_count = len(self.users)

就像这样:

def __init__(self):
    self.status()

def status(self):
    self.user_count = len(self.users)
    return True

就像这样:

def __init__(self):
    self.status()

@classmethod
def status(self):
    self.user_count = len(self.users)
    return True

所有三个版本都会抛出相同的错误。我怎样才能克服这个问题。

非常感谢!

1 个答案:

答案 0 :(得分:0)

您可以使用属性:

class User(Base):
    ...
    @property
    def user_count(self):
        return len(self.users)