我有模型.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 搜索来获取具有两个或三个类别中的任何一个的帖子。现在我只能获取第一个。(------------------------ -详情------------------)
我不确定我是否正确理解了你的意图。
如果要查询属于给定 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 与给定的字符串匹配。