Add hashtag cascade relations

This commit is contained in:
LeonspaceX
2026-01-31 17:11:08 +08:00
parent 8e561a2eb7
commit 3a30271fe6
3 changed files with 63 additions and 17 deletions

View File

@@ -53,23 +53,35 @@ class Submission(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
content = db.Column(db.Text, nullable=False)
identity_token = db.Column(db.String(36), nullable=True)
status = db.Column(db.String(20), default='Pending')
status = db.Column(db.String(20), default='Pending', index=True)
created_at = db.Column(db.DateTime, default=now_time)
updated_at = db.Column(db.DateTime, default=now_time, onupdate=now_time)
upvotes = db.Column(db.Integer, default=0)
downvotes = db.Column(db.Integer, default=0)
comments = db.relationship('Comment', backref='submission', lazy=True, cascade='all, delete-orphan')
hashtags = db.relationship(
'Hashtag',
primaryjoin="and_(Hashtag.type==0, Hashtag.target_id==Submission.id)",
cascade='all, delete-orphan',
lazy=True
)
class Comment(db.Model):
__tablename__ = 'comments'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
submission_id = db.Column(db.Integer, db.ForeignKey('submissions.id'), nullable=False)
submission_id = db.Column(db.Integer, db.ForeignKey('submissions.id'), nullable=False, index=True)
nickname = db.Column(db.String(50), default='匿名用户')
content = db.Column(db.Text, nullable=False)
identity_token = db.Column(db.String(36), nullable=True)
created_at = db.Column(db.DateTime, default=now_time)
parent_comment_id = db.Column(db.Integer, db.ForeignKey('comments.id'), nullable=True)
hashtags = db.relationship(
'Hashtag',
primaryjoin="and_(Hashtag.type==1, Hashtag.target_id==Comment.id)",
cascade='all, delete-orphan',
lazy=True
)
class Report(db.Model):
__tablename__ = 'reports'
@@ -711,10 +723,38 @@ def get_post_info():
@app.route('/api/hot_topics', methods=['GET'])
def get_hot_topics():
try:
submission_tags = db.session.query(
Hashtag.name.label('name')
).join(
Submission,
db.and_(Hashtag.type == 0, Hashtag.target_id == Submission.id)
).filter(
Submission.status == 'Pass'
)
comment_tags = db.session.query(
Hashtag.name.label('name')
).join(
Comment,
db.and_(Hashtag.type == 1, Hashtag.target_id == Comment.id)
).join(
Submission,
Comment.submission_id == Submission.id
).filter(
Submission.status == 'Pass'
)
union_subq = submission_tags.union_all(comment_tags).subquery()
rows = db.session.query(
Hashtag.name,
db.func.count(Hashtag.name).label('count')
).group_by(Hashtag.name).order_by(db.func.count(Hashtag.name).desc()).limit(3).all()
union_subq.c.name,
db.func.count(union_subq.c.name).label('count')
).group_by(
union_subq.c.name
).order_by(
db.func.count(union_subq.c.name).desc(),
union_subq.c.name.asc()
).limit(3).all()
data = [{"name": name, "count": int(count)} for name, count in rows]
return jsonify({"code": 1000, "data": {"list": data}})