AttributeError:尝试检索关系数据时,'int'对象没有属性'name'

时间:2015-08-10 16:51:38

标签: python flask sqlalchemy

我使用SQLAlchemy创建了这些表:

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    ## user info
    name = db.Column(db.String)
    email = db.Column(db.String)
    password = db.Column(db.String)
    category = db.Column(db.Enum('admin', 'employee', 'client', name='user_category'),\
        default='client')
    role = db.Column(db.String)

    def check_password(self, password):
        return check_password_hash(self.password, password)

    def set_password(self, password):
        self.password = generate_password_hash(password)

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

    def get_id(self):
        try:
            return unicode(self.id)  # python 2
        except NameError:
            return str(self.id)  # python 3

    def get_category(self):
        return self.category

    def __repr__(self):
        return '<User %r>' % self.name

class Ticket(db.Model):
    __tablename__ = 'tickets'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String)
    description = db.Column(db.Text)
    priority = db.Column(db.Enum('high', 'normal', \
        'low', name='ticket_priority'), default='normal')
    status = db.Column(db.Enum('open', 'closed', \
        'on hold', name='ticket_status'), default='open')
    start_time = db.Column(db.DateTime)
    end_time = db.Column(db.DateTime)
    worked_hours = db.Column(db.Interval,
        default=datetime.timedelta(days=0, hours=0, minutes=0, seconds=0))
    play_time = db.Column(db.DateTime)
    pause_time = db.Column(db.DateTime)
    client = db.Column(db.Integer, db.ForeignKey('users.id'))
    employee = db.Column(db.Integer, db.ForeignKey('users.id'))

    def __repr__(self):
        return '<Ticket %r>' % self.title

在我的模板中,我有这个HTML:

        <thead>
        <tr>
            <th>{{ _('Client') }}</th>
            <th>{{ _('Employee') }}</th>
            <th>{{ _('Start Time') }}</th>
            <th>{{ _('End Time') }}</th>
        </tr>
        </thead>
        <tbody>
        <tr>
            <td>{{ ticket.client.name }}</td>
            <td>{{ ticket.employee.name }}</td>
            <td>{{ ticket.start_time }}</td>
            <td>{{ ticket.end_time }}</td>
        </tr>
        </tbody>

但是当我打开此页面时,既不会显示客户名称或员工姓名。尝试打印 ticket.client.name 时,会返回以下错误:

AttributeError: 'int' object has no attribute 'name'

为什么会发生这种情况?如何以正确的方式访问客户信息?

1 个答案:

答案 0 :(得分:0)

目前,Ticket.client是整数外键列。所以ticket.client是一个int,而int没有name属性。而是重命名列client_id,并为客户端创建relationship。由于用户有多个外键,因此需要告诉使用哪个外键。

class Ticket(db.Model):
    ...
    client_id = db.Column(db.Integer, db.ForeignKey(User.id))
    ...

    client = db.relationship(Client, foreign_keys=client_id)