| # models/post.py |
| from extensions import db |
| from datetime import datetime |
| |
| # association table for Post <-> Tag |
| post_tags = db.Table( |
| 'post_tags', |
| db.Column('post_id', db.Integer, db.ForeignKey('posts.id', ondelete='CASCADE'), primary_key=True), |
| db.Column('tag_id', db.Integer, db.ForeignKey('tags.id', ondelete='CASCADE'), primary_key=True) |
| ) |
| |
| class Post(db.Model): |
| __tablename__ = 'posts' |
| |
| id = db.Column(db.Integer, primary_key=True) |
| user_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='CASCADE'), nullable=False) |
| topic_id = db.Column(db.Integer, db.ForeignKey('topics.id', ondelete='SET NULL')) |
| type = db.Column(db.Enum('text', 'image', 'video', 'document'), default='text', nullable=False) |
| title = db.Column(db.String(255), nullable=False) |
| content = db.Column(db.Text, nullable=False) |
| media_urls = db.Column(db.JSON) |
| status = db.Column(db.Enum('draft', 'pending', 'published', 'deleted', 'rejected'), |
| default='draft', nullable=False) |
| heat = db.Column(db.Integer, default=0, nullable=False) |
| created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) |
| updated_at = db.Column(db.DateTime, default=datetime.utcnow, |
| onupdate=datetime.utcnow, nullable=False) |
| |
| # relationships |
| tags = db.relationship('Tag', secondary=post_tags, backref=db.backref('posts', lazy='dynamic')) |
| behaviors = db.relationship('Behavior', backref='post', lazy='dynamic', cascade='all, delete') |
| comments = db.relationship('Comment', backref='post', lazy='dynamic', cascade='all, delete') |