在Flask中创建调查

时间:2019-04-15 17:27:27

标签: python flask flask-sqlalchemy flask-wtforms

我是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()类列应反映烧瓶形式的问题

  2. 鉴于同一调查将由用户每两周完成一次,因此区分每项调查的最佳方法是什么?用户将在加入后的两个星期内的不同日期完成调查。

谢谢大家。

1 个答案:

答案 0 :(得分:0)

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

days_since_registration = (survey.date.date() - user.date.date()).days
weeks_since_registration = round(days_since_registration / 7.0)