【问题标题】:How to create a parent-child-subchild information in flask-sqlalchemy如何在flask-sqlalchemy中创建父子子信息
【发布时间】:2018-04-24 09:32:49
【问题描述】:

我在服务器端使用 Flask-SQLAlchemy 和烧瓶。 我想在用户(父)、类别(子)和项目(子子)之间创建关系。 我不知道父子子子项是否是解决此问题的正确方法,但我的最终目标是轻松获取每个类别中用户评分的所有项目。 以下是我尝试过的一种情况,但它不起作用,可能是因为我做错了什么。

我有一个包含项目类别的项目表(例如小说、非小说、犯罪书籍)。每个类别有 5 个项目(书籍)。我想让用户对每个类别的五个项目进行评分。所以,我有下表。

class User(db.Model, UserMixin):
  __tablename__ = "users"
  id = db.Column('user_id',db.Integer, primary_key=True)
  active = db.Column(db.Boolean(), nullable=False, default=False)
  username = db.Column(db.String(50), nullable=False, unique=True)
  password = db.Column(db.String(255), nullable=False, default='')

# do we need unique=True in any column
#let's create class for item(child) and category(parent) 
class Rated_item(db.Model):
  __tablename__ = 'item'
  id = db.Column(db.Integer, primary_key=True)
  item_id = db.Column(db.Integer)
  category_id = db.Column(db.Integer)
  quality = db.Column(db.String(50))
  taste = db.Column(db.String(50))
  user_id = db.Column(db.Integer, db.ForeignKey('users.user_id'))
  # evaluation_status is set to True, once a user finishes an item.
  evaluation_status = db.Column(db.Boolean, unique=False, default=False)

由于我正在使用基于 flask-jinja 的网页,因此每次用户登录时,我都需要发送用户的状态,即用户评价了多少类别以及每个类别中评价了多少项目。

我尝试关注,但我认为我在做一些概念上的错误。

status=Rated_item.query.filter_by(user_id = current_user.id).order_by(Rated_item.pub_date.desc()).all()

任何建议我应该如何改进我的表格或查询以获得用户评分的所有类别(以及每个类别中的所有项目)。

【问题讨论】:

    标签: sqlalchemy flask-sqlalchemy


    【解决方案1】:

    '''用户评分的项目'''

    status1 = Rated_item.query.func.count(distinct(item_id)).filter_by(user_id == current_user.id) 
    

    '''用户评分的类别'''

    status2 = Rated_item.query.func.count(distinct(category_id)).filter_by(user_id == current_user.id)
    

    我想这个查询会对你有所帮助。

    【讨论】:

    • 我在上面尝试过,但我在 func AttributeError: 'BaseQuery' object has no attribute 'func' 上遇到错误我在我的 python 视图文件中这样做:from sqlalchemy import func
    • 它的“功能”是个问题。显然,与 func 相同的错误。
    • 这是一个忽略,尝试在 filter_by 中使用'=='
    • 还是一样的func错误,filter_by用single=就好了。即使这样也有效:Rated_item.query.filter_by(user_id = current_user.id).count() 但是当我使用 func 时,它失败了。
    • 哦,不知道这个:/
    猜你喜欢
    • 2020-07-05
    • 2016-06-06
    • 1970-01-01
    • 2020-01-15
    • 2012-11-20
    • 1970-01-01
    • 2019-10-12
    • 2014-10-15
    • 2022-07-03
    相关资源
    最近更新 更多