在Flask中创建调查

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

我是Flask的新手所以当我遇到路障时希望得到一些帮助。

目标:我需要用户能够每两周登录并完成一次调查。这将是他们完成的同一调查,我需要能够区分哪个调查在第1周,第2周等完成。每个用户将在不同的日期完成调查,因为它是从他们加入的两周后而不是每个人完成调查在同一天完成。

我目前的思考过程:我在models.py中为User创建了一个类,为Survey创建了一个类,并将它们与db.relationship()列连接起来。我有一个用户填写的wtf表单(字段对应于调查类中的属性)。这是代码,如果它有帮助:

from project import db,login_manager
from werkzeug import generate_password_hash, check_password_hash
from flask_login import UserMixin
from datetime import datetime


@login_manager.user_loader
def load_user(user_id):
    return User.query.get(user_id)

class User(db.Model, UserMixin):

    __tablename__ = 'users'

    #columns of database
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String, unique=True, index=True)
    username = db.Column(db.String, unique=True, index=True)
    password_hash = db.Column(db.String(128))

    survey = db.relationship('Survey', backref='respondee', lazy=True)

    def __init__(self, email, username, password):
        self.email= email
        self.username = username
        self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.password_hash, password)

    def __repr__(self):
        return f"Username {self.username}"



class Survey(db.Model):

    users = db.relationship(User)

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)

    # what the respondee needs to provide when completing the questionnaire (not finished as I'm waiting on the actual questions at the moment
    def __init__(self, user_id, )

这可能不是正确的逻辑,但我不确定最好的方法是什么。

希望有人指出我正确的方向:

  1. 我是否认为Survey()类列应该反映Flask表单问题
  2. 鉴于相同的调查将由用户每两周完成一次,那么在每次调查完成时区分的最佳方式是什么。用户将在加入后的两周内完成不同日期的调查。

多谢你们。

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

您已在Survey.date中保存每个调查的创建日期时间。您只需向User添加一个相同的字段即可节省每个用户的创建时间。然后,您可以执行简单的日期算术,以找出每个调查对应的两周时间点。

days_since_registration = (survey.date.date() - user.date.date()).days
weeks_since_registration = round(days_since_registration / 7.0)
© www.soinside.com 2019 - 2024. All rights reserved.