Создание опроса в Flask

#python #flask #flask-sqlalchemy #flask-wtforms

#python #flask #flask-sqlalchemy #flask-wtforms

Вопрос:

Я новичок в Flask, поэтому надеялся на некоторую помощь, поскольку столкнулся с препятствием.

Цель: мне нужно, чтобы пользователи могли входить в систему и заполнять опрос каждые две недели. Это будет тот же опрос, который они завершают, и мне нужно иметь возможность различать, какой опрос был завершен на неделе 1, неделе 2 и т. Д. Каждый пользователь завершит опрос в другую дату, поскольку с момента их присоединения прошло две недели, а не все участники заполняют опрос в один и тот же день.

Мой текущий мыслительный процесс: я создал один класс для пользователя и один класс для опроса в моем models.py и соединил их с помощью столбца 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. Учитывая, что один и тот же опрос будет заполняться пользователями каждые две недели, каков наилучший способ отличить время завершения каждого опроса. Пользователи будут заполнять опрос в разные даты, поскольку с момента их присоединения пройдет две недели.

Спасибо, ребята.

Ответ №1:

Вы уже сохраняете дату и время создания каждого опроса в Survey.date. Вам просто нужно добавить идентичное поле для User, чтобы сэкономить время создания каждого пользователя. Затем вы можете выполнить простую арифметику даты, чтобы выяснить, какой двухнедельной временной точке соответствует каждый опрос.

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