python - AttributeError:“函数”对象没有属性“place_id”
问题描述
我试图做我们网站的用户关注学校功能,我做了一个这样的关系表(名为“关注”)
class Follow(db.Model):
__tablename__ = 'follow'
follower_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
followed_id = db.Column(db.String(50),
db.ForeignKey('school.place_id'),primary_key=True)
timestamp = db.Column(db.DateTime, default=datetime.utcnow)
用户和学校模型的相关属性为:
class User(UserMixin, db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
followed = db.relationship('Follow',
foreign_keys=[Follow.follower_id],
backref=db.backref('follower', lazy='joined'),
lazy='dynamic',cascade='all,delete-orphan')
class School(db.Model):
_tablename_ = 'school'
place_id = db.Column(db.String(50), primary_key=True)
followers = db.relationship('Follow',
foreign_keys=[Follow.followed_id],
backref=db.backref('followed,lazy=joined'), # corresponding followed_id
lazy='dynamic',
cascade='all, delete-orphan')
此外,我在用户模型中编写了三个与跟随行为相关的方法
def follow(self, school):
if not self.is_following(school):
f = Follow(follower=self, followed=school)
db.session.add(f)
db.session.commit()
def unfollow(self, school):
f = self.followed.filter_by(followed_id=school.place_id).first()
if f is not None:
db.session.delete(f)
db.session.commit()
def is_following(self,school):
return self.followed.filter_by(followed_id=school.place_id).first() is not None
我还在我的 main/views.py 中写了以下内容
@main.route('/follow/<official_school_name>')
@login_required
# @permission_required(Permission.USER_LIKE)
def follow(official_school_name):
school = School.query.filter_by(official_school_name=official_school_name).first()
if school is None:
flash('Invalid school name.')
return redirect(url_for('.index'))
if current_user.is_following(school):
flash('You have already followed this school.')
return redirect(url_for('.school', official_school_name=school.official_school_name, roll_number=school.roll_number))
current_user.follow(user)
flash('You are not following %s.' % official_school_name)
return redirect(url_for('.school', official_school_name=school.official_school_name, roll_number=school.roll_number))
最后,我只是做了一个非正式的按钮来测试跟随功能。
<a href="{{ url_for('.follow', official_school_name=school.official_school_name, roll_number=school.roll_number) }}"
class = "btn btn-primary">Follow</a>
但是,当我单击“关注”按钮时,它会显示错误:
File "C:\Users\kjhk\venv\lib\site-packages\flask\app.py", line 2309, in __call__
Open an interactive python shell in this framereturn self.wsgi_app(environ, start_response)
File "C:\Users\kjhk\venv\lib\site-packages\werkzeug\contrib\fixers.py", line 152, in __call__
return self.app(environ, start_response)
File "C:\Users\kjhk\venv\lib\site-packages\flask\app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "C:\Users\kjhk\venv\lib\site-packages\flask\app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\kjhk\venv\lib\site-packages\flask\_compat.py", line 35, in reraise
raise value
File "C:\Users\kjhk\venv\lib\site-packages\flask\app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\kjhk\venv\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\kjhk\venv\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\kjhk\venv\lib\site-packages\flask\_compat.py", line 35, in reraise
raise value
File "C:\Users\kjhk\venv\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\kjhk\venv\lib\site-packages\flask\app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "E:\Project0619\ProjectTest\Code\app\main\views.py", line 197, in follow
current_user.follow(user)
File "E:\Project0619\ProjectTest\Code\app\models\User.py", line 99, in follow
if not self.is_following(school):
File "E:\Project0619\ProjectTest\Code\app\models\User.py", line 113, in is_following
return self.followed.filter_by(followed_id=school.place_id).first() is not None
AttributeError: 'function' object has no attribute 'place_id'
我试图将“is_following”函数更改为:
def is_following(self,school):
return self.followed.filter_by(followed_id=school.id).first() is not None
然后出现另一个错误:
File "C:\Users\kjhk\venv\lib\site-packages\flask\app.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\kjhk\venv\lib\site-packages\werkzeug\contrib\fixers.py", line 152, in __call__
return self.app(environ, start_response)
File "C:\Users\kjhk\venv\lib\site-packages\flask\app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "C:\Users\kjhk\venv\lib\site-packages\flask\app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\kjhk\venv\lib\site-packages\flask\_compat.py", line 35, in reraise
raise value
File "C:\Users\kjhk\venv\lib\site-packages\flask\app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\kjhk\venv\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\kjhk\venv\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\kjhk\venv\lib\site-packages\flask\_compat.py", line 35, in reraise
raise value
File "C:\Users\kjhk\venv\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\kjhk\venv\lib\site-packages\flask\app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\kjhk\venv\lib\site-packages\flask_login\utils.py", line 261, in decorated_view
return func(*args, **kwargs)
File "E:\Project0619\ProjectTest\Code\app\main\views.py", line 194, in follow
if current_user.is_following(school):
File "E:\Project0619\ProjectTest\Code\app\models\User.py", line 113, in is_following
return self.followed.filter_by(followed_id=school.id).first() is not None
AttributeError: 'School' object has no attribute 'id'
这证明第二个 argus(School.id) 可以引用“学校”模型,但是任何人都可以帮我回答为什么会出现第一个错误?非常感谢!
解决方案
此错误:AttributeError: 'School' object has no attribute 'id'
并不能很好地证明您的其他问题。仔细查看每个调用堆栈会告诉我们更多关于正在发生的事情:
第一个调用if not self.is_following(school)
用作其入口点,而第二个调用使用if current_user.is_following(school)
. 我可以从您发布的 Tracebacks 中看到这一点。
在第二个中,您将学校定义为:
school = School.query.filter_by(official_school_name=official_school_name).first()
在后一种情况下,school
实际上是School
类的一个实例。
但是,在第一个示例中,学校 arg 被传入为user
:
current_user.follow(user)<-----
...并且user
显然在您的代码中定义为 type function
。您可以通过打印或返回来测试它type(user)
。
传递school
给第一个电话,这应该会停止AttributeError: 'function' object has no attribute 'place_id'
问题。
推荐阅读
- gfortran - 使用 -fcheck=all 时不会警告未初始化的变量
- mysql - 如何使用mysql准备和执行语句调用带有输入和输出参数的存储过程?
- vb.net - vb.net 中的 Datagridview 到 Crystal Report
- python - 将numpy digitize函数翻译成c#
- laravel - htmlspecialchars() 期望参数 1 是字符串,给定数组(查看:/opt/lampp/htdocs/SED/resources/views/reports/log_print.blade.php)
- vba - Word VBA:While循环要做,直到一无所获
- php - 在for循环php中获取值1 - 2 - 1 - 2 - 1
- flutter - 在 Flutter 中开发私有包
- python - Pyenv 无法在 mac 中安装 python 3.5.2
- android - 在 textview 更新上旋转动画