如何使用SQLAlchemy和Flask对帖子进行分类查询?

问题描述 投票:0回答:1

我有模型.py

from flask_login import UserMixin
import datetime
from . import db
from werkzeug.security import generate_password_hash, check_password_hash
from datetime import timezone

# Create a Model for User

class User(db.Model, UserMixin):
id = db.Column(db.Integer(), primary_key=True, unique=True)
first_name = db.Column(db.VARCHAR(20), nullable=False, unique=True)
second_name = db.Column(db.VARCHAR(50), nullable=False, unique=True)
email = db.Column(db.VARCHAR(50), nullable=False, unique=True)
roles = db.Column(db.VARCHAR(50), nullable=False)
profile_pic = db.Column(db.VARCHAR(), nullable=True)
date_time = db.Column(db.DateTime, default=datetime.datetime.utcnow())
\# Relation with Posts
posts = db.relationship('Posts', backref='publisher')

    # Password
    password_hash = db.Column(db.VARCHAR(128))
    
    @property
    def password(self):
        raise AttributeError('password is not a readable attribute!')
    
    @password.setter
    def password(self, password):
        self.password_hash = generate_password_hash(password)
    
    def verify_password(self, password):
        return check_password_hash(self.password_hash, password)
    
    def __repr__(self):
        return f'{self.name} '

# Create a Model for Posts

class Posts(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.VARCHAR(255), nullable=False)
content = db.Column(db.VARCHAR(255), nullable=False)
author = db.Column(db.VARCHAR(255))
post_pic = db.Column(db.VARCHAR(), nullable=True)
\# Date for published Post
date_posted = db.Column(db.DateTime, default=datetime.datetime.utcnow())
\# Date for redacted Post
date_redacted_post = db.Column(db.DateTime, default=datetime.datetime.utcnow())
slug = db.Column(db.VARCHAR(255), unique=True)
\# Relations - Foreign Key to link User/Admin
publisher_id = db.Column(db.Integer, db.ForeignKey('user.id', name='publisher'))
categories = db.relationship("Category", secondary="post_category", back_populates="posts", lazy='dynamic')
keywords = db.relationship("Keyword", secondary="post_keyword", back_populates="posts", lazy='dynamic')

    def __init__(self, *args, **kwargs):
        if not 'slug' in kwargs:
            kwargs['slug'] = slugify(kwargs.get('title', ''))
            super().__init__(*args, **kwargs)
    
    def __str__(self):
        return self.categories

# Create a Model for Category

class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
cat = db.Column(db.VARCHAR(255), nullable=False)
cat_slug = db.Column(db.VARCHAR(255), unique=True)
\# Relations with Posts
posts = db.relationship("Posts", secondary="post_category", back_populates="categories")

    def __str__(self):
        return self.cat

# Create Association table to connect Posts and Category

post_category = db.Table(
"post_category",
db.Column("posts_id", db.ForeignKey("posts.id"), primary_key=True),
db.Column("cat_id", db.ForeignKey("category.id"), primary_key=True)
)

我有一个观点.py

# Categories page / selected / searched by category item

@views.route('/posts/category-\<string:cat_slug\>')
def cat_posts(cat_slug):
page_title = 'Categories :'
users = User.query.order_by(User.second_name.desc())
side_posts = Posts.query.order_by(Posts.title.desc()).paginate(per_page=5, page=1, error_out=True)
page = request.args.get('page', 1, type=int)
cats = Category.query.order_by(Category.cat.asc())
keyws = Keyword.query.order_by(Keyword.keyw.asc())
pgn_route = 'views.all_posts'
posts = Posts.query.order_by(Posts.title.asc()).paginate(per_page=6, page=page, error_out=True)
results = Posts.query.join(User).filter(User.id == Posts.publisher_id)
category = Posts.query.join(Category).filter(Posts.id == Posts.publisher_id)
query_post = Posts.query.join(post_category).join(Category).filter((post_category.c.posts_id == Posts.id) &
(post_category.c.cat_id == Category.id)).all()
query_category = Category.query.join(post_category).join(Posts).filter((post_category.c.posts_id == Posts.id) &
(post_category.c.cat_id == Category.id)).all()
print(query_category)

    return render_template("cat_keyw/categories.html", page_title=page_title, cat_slug=cat_slug, q_cat=query_category,
                           side_posts=side_posts, q_post=query_post, cats=cats, keyws=keyws) 

如你所见,我尝试了很多

我有html

{% for post in q_post %}                   
    {% if post.categories[0].cat_slug == cat_slug %}            
        {% include 'cat_keyw/cat_keyw_template.html' %}        
    {% elif post.categories[1].cat_slug == cat_slug %}             
        {% include 'cat_keyw/cat_keyw_template.html' %}       
    {% endif %}  
{% endfor %}

所以我知道我的查询不正确,而且我以前从未使用过类别对象。问题是如何通过 slug 搜索来获取具有两个或三个类别中的任何一个的帖子。现在我只能获取第一个。(------------------------ -详情------------------)

flask sqlalchemy flask-sqlalchemy
1个回答
0
投票

我不确定我是否正确理解了你的意图。

如果要查询属于给定 slug 的类别的所有帖子,可以使用以下命令。

posts = Posts.query\
    .join(post_category, post_category.c.posts_id == Posts.id)\
    .join(Category, post_category.c.cat_id == Category.id)\
    .filter(Category.cat_slug == cat_slug)\
    .all()

您要求所有帖子,
它们以各自的 id 出现在连接表中,
其关联表的关联表 cat_id 出现在类别下并且
类别的 slug 与给定的字符串匹配。

© www.soinside.com 2019 - 2024. All rights reserved.