python - 如何将单个日期与 Flask、SQLAlchemy、SQLite 进行比较
问题描述
我现在刚加入 stackoverflow 社区,因为我试图完成我的第一个 Python-flask 应用程序,但在获取和比较单个用户的单个日期与 sqlalchemy 和 sqlite 时遇到了一些问题。
这是我的进口:
from flask import Flask, request, jsonify, render_template, url_for, redirect, flash
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine, MetaData, func
import datetime
这是我的表数据库模型:
class BloodDonation(db.Model):
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String, nullable=False)
age = db.Column(db.Integer, nullable=False)
blood_groups = db.Column(db.String, nullable=False)
city = db.Column(db.String, nullable=False)
phone_no = db.Column(db.String, nullable=False)
latest_donation = db.Column(db.Date, nullable=False)
next_donation = db.Column(db.Date)
donation_counter = db.Column(db.Integer, default=1)
这是一个简单的 CRUD 应用程序,我应该将献血存储在数据库中,每个用户的献血阈值为 3 个月。为此,我使用手机号码作为用户标识符并使用 datetime 模块,因此当用户尝试在 90 天之前进行多于捐赠时,应用程序必须显示禁止捐赠消息。
这是我的代码:
@app.route('/blood_donation', methods=['GET','POST'])
def blood_donation():
if request.method == 'GET':
blood_groups = ['A+', 'A-', 'B+', 'B-', 'AB+', 'AB-', 'O+', 'O-']
return render_template('donate.html', blood_groups = blood_groups)
else:
donation_day = datetime.date.today()
next_donation_date = threshold_time(donation_day) # this func return donation date + 90 days
data_fields = ['name','age','blood_groups','city','phone_no']
data_dict = {}
data_dict['latest_donation'] = donation_day
data_dict['next_donation'] = next_donation_date
for field in data_fields:
data_dict[field] = request.form.get(field).lower()
for value in data_dict.values():
if value == "":
return "Please enter all the details."
counter = db.session.query(BloodDonation).filter(BloodDonation.phone_no == data_dict['phone_no']).count()
next_bd_date = db.session.query(BloodDonation).filter(func.DATE(BloodDonation.latest_donation) >= 0)
if counter >= 0 and next_bd_date and\
db.session.query(BloodDonation).filter(func.DATE(BloodDonation.latest_donation)\
<= data_dict['latest_donation']):
counter += 1
data_dict['donation_counter'] = counter
blood_donation = BloodDonation(**data_dict)
db.session.add(blood_donation)
db.session.commit()
return redirect(url_for('home'))
return "Donation forbidden!!!"
我认为问题出在 if 语句中,用于比较我用作捐赠计数器和用户标识符的日期和手机号码,因为应用程序会继续更新数据库而不禁止返回捐赠。
这里错误的代码:
if counter >= 0 and next_bd_date and \
db.session.query(BloodDonation).filter(func.DATE(BloodDonation.latest_donation) <=
data_dict['latest_donation']):
我希望有人可以帮助我,因为我不是专业人士而是初学者
提前致谢!
解决方案
看起来您可能有几个间距问题。如果您没有适当的间距,Python 不喜欢它。尝试这个。此外,我不确定您想要最终返回语句的位置,所以我不确定我是否正确间隔了它。
@app.route('/blood_donation', methods=['GET','POST'])
def blood_donation():
if request.method == 'GET':
blood_groups = ['A+', 'A-', 'B+', 'B-', 'AB+', 'AB-', 'O+', 'O-']
return render_template('donate.html', blood_groups = blood_groups)
else:
donation_day = datetime.date.today()
next_donation_date = threshold_time(donation_day)
data_fields = ['name','age','blood_groups','city','phone_no']
data_dict = {}
data_dict['latest_donation'] = donation_day
data_dict['next_donation'] = next_donation_date
for field in data_fields:
data_dict[field] = request.form.get(field).lower()
for value in data_dict.values():
if value == "":
return "Please enter all the details."
counter = db.session.query(BloodDonation).filter(BloodDonation.phone_no == data_dict['phone_no']).count()
next_bd = db.session.query(BloodDonation).filter(func.DATE(BloodDonation.latest_donation) >= 0)
if counter >= 0 and next_bd and \
db.session.query(BloodDonation).filter(func.DATE(BloodDonation.latest_donation) <= data_dict['latest_donation']):
counter += 1
data_dict['donation_counter'] = counter
blood_donation = BloodDonation(**data_dict)
db.session.add(blood_donation)
db.session.commit()
return redirect(url_for('home'))
return "Donation forbidden!!!"
推荐阅读
- java - 数组java中的最小值
- javascript - 通过 vue 和 electron 共享一个全局变量
- python - 如何在已知变量的情况下数值求解多变量联立方程?
- c - C语言:从文件重定向输入时如何知道何时不再有来自标准输入的输入
- javascript - 如何在 onwrite 事件中获取 firebase pushID?
- javascript - 具有两个数字输入的多个滑块
- php - 找不到驱动程序,将php连接到sql server
- dart - dart中的完整路径和相对路径有什么区别
- python - Django Rest Framework 自定义异常处理无法识别参数
- npm - 纱线安装,模块构建失败:错误:找不到预设“es2015”