【问题标题】:'NoneType' object has no attribute 'owner' when trying to access relationship尝试访问关系时,“NoneType”对象没有属性“所有者”
【发布时间】:2015-01-30 01:50:49
【问题描述】:

我正在尝试在Toy.owner 关系上加载一个值。这些是我的模型:

class User(db.Model):
    __tablename__ = 'User'
    id = db.Column(db.Integer, primary_key=True)
    type = db.Column(db.String(50))
    nickname = db.Column(db.String(255))
    email = db.Column(db.String(255))
    password = db.Column(db.String(255))

    __mapper_args__ = {
        "polymorphic_on":type,
        'polymorphic_identity':'user',
        'with_polymorphic':'*'
    }

class Owner(User):
    __tablename__ = 'Owner'
    id = db.Column(db.Integer, db.ForeignKey('User.id', ondelete='CASCADE'), primary_key=True)
    owner_id = db.Column(db.Integer, autoincrement=True, primary_key=True, unique=True)  
    toys = db.relationship('Toy', backref='owner', lazy='dynamic')

    __mapper_args__ = {'polymorphic_identity':'owner'}

class Toy(db.Model):
    __tablename__ = 'Toy'
    id = db.Column(db.Integer, primary_key=True)
    owner_id = db.Column(db.Integer, db.ForeignKey('Owner.owner_id'))

这个视图应该使用clicked_toy.owner_id:

@app.route('/<path:toy_id>', methods=['GET','POST'])
def toy_info(toy_id):
    clicked_toy = db.session.query(Toy).filter(Toy.id == toy_id).first()
    owner = db.session.query(Owner).filter(Owner.owner_id == clicked_toy.owner.owner_id).first()
    return render_template('toy_info.html', clicked_toy=clicked_toy, owner=owner)

这不起作用,我得到了错误:

File ".../controller.py", line 67, in toy_info
owner = db.session.query(Owner).filter(Owner.owner_id == clicked_toy.owner.owner_id).first()
AttributeError: 'NoneType' object has no attribute 'owner'

当我尝试调用 clicked_toy.owner_id 时,我得到了同样的错误:

 File ".../controller.py", line 67, in toy_info
 owner = db.session.query(Owner).filter(Owner.owner_id == clicked_toy.owner_id).first()
 AttributeError: 'NoneType' object has no attribute 'owner_id'

我缺少什么以及如何解决?

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    .first() 如果没有结果则返回None。所以您对clicked_toy 的查询没有返回任何结果。

    当您所做的只是过滤主键时,您可以使用get 而不是filter。 Flask-SQLAlchemy 更进了一步,如果没有结果,您可以引发 404。

    clicked_toy = Toy.query.get_or_404(toy_id)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 2020-01-06
      • 2021-08-03
      • 2021-12-10
      • 1970-01-01
      相关资源
      最近更新 更多