flask網頁建設主題二
followers關係表
follower_id /followed_id結構
1 followed 2 and 3
3 followed 2
2 follower 1 and 3
3 follower 1
user.id 與 follower.id 會找出1關注了誰
user.id 與 followed.id會找出2被誰關注
建立followers table
models.py
followers = db.Table('followers',
db.Column('follower_id', db.Integer, db.ForeignKey('user.id')),
db.Column('followed_id', db.Integer, db.ForeignKey('user.id'))
)
followers table 是一張描述關係的表
因為table數據是描述關係不用class定義
欄位本身採用ForeignKey外鍵(必須是已經存在id的資料)
class User
多對多的關係
followed = db.relationship(
'User', secondary=followers,
primaryjoin=(followers.c.follower_id == id),
secondaryjoin=(followers.c.followed_id == id),
backref=db.backref('followers', lazy='dynamic'), lazy='dynamic')
primaryjoin=(followers.c.follower_id == id) /找出followed
secondaryjoin=(followers.c.followed_id == id) /找出follower
backref=db.backref('followers', lazy='dynamic'), lazy='dynamic')
/ 可以直接對follower followed操作
因為更動了models.py 新增了關係的連接表followers
python manager.py db migrate -m “add followers”
python manager.py db upgrade
進入python shell測試
from twittor import db, create_app
from twittor.models import User
app = create_app()
app.app_context().push()
User.query.all()
User.query.count() ‘計算個數
u1=User.query.get(1)
u3=User.query.get(3)
u1.followed ‘u1.followed是一個list可以透過迴圈看其中的內容如下
<sqlalchemy.orm.dynamic.AppenderBaseQuery object at 0x1067b2b38>
for u in u1.followed:
… print(u)
…(尚無資料)
follow 實作
u1.followed.append(u3)
db.session.commit()
for u in u1.followed:
… print(u)
id=3, username=test1, email=test1@test1.com,password, password_hashpbkdf2:sha256:150000$KT55a5ra$5f09f637f20f1a7577a01cde374ec8a7c8a7a95e5aaa0b385c9b6084951f2414 (u1.followed有資料)
unfollow 實作
u1.followed.remove(u3)
db.session.commit()
for u in u1.followed:
… print(u)
…(無資料)
查詢
u1.followed.all() 有一個跟隨 ‘followed
u4.followed.all() 有一個跟隨
u3.followers.all() 有兩個粉絲 ‘followers
能夠這樣的followed/followers查詢因為下面models/def User的設定
def is_following(self, user)傳入一個用戶判斷是否已經followed過了
templates/user.html
自己對自己不用顯示
自己對他人需要判斷是不是is_following
>>user 被查看的用戶
>>current_user當前登入的用戶
修改__init__.py,使得profile能接受requesu的POST
app.add_url_rule('/<username>', 'profile', user, methods=['GET', 'POST'])
user.html判斷用戶點擊what按鈕
賦予按鈕name
{% if user != current_user %}
{% if current_user.is_following(user) %}
<input type="submit" name="request_button" value="Unfollow">
{% else %}
<input type="submit" name="request_button" value="Follow">
{% endif %}
router.py/def user
print(request.form.to_dict)能顯示出後台收到的資料
就可以透過request.form[‘request_button’]返回的值做判斷
if request.method == 'POST':
if request.form['request_button'] == 'Follow':
print('click Follow')
else:
print('click unfollow')
models.py/class user
def follow
def unfollow
route.py/def user
followers/followed計數器
user.followers.count()/user.followed.count()