【发布时间】:2021-02-11 05:28:11
【问题描述】:
我现在刚加入 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']):
希望有人可以帮助我,因为我不是专业人士而是初学者
提前致谢!
【问题讨论】:
-
很好地获取最后捐赠日期和当前日期并找出天数之间的差异,超过 90 天则允许其他禁止,或者创建一个虚拟列来保持无法捐赠的日期并检查捐赠是否尝试日期是否小于该日期
-
我试图做最后捐赠日和当前日期之间的差异,但我得到了这个错误:TypeError: unsupported operand type(s) for -: 'BloodDonation' and 'datetime.date'
-
但是我需要为单个用户获取一个最新的捐赠日期,而不是一个键值对列表
-
stackoverflow.com/questions/151199/… 这可能有助于计算天数,您可以使用 datetime.datetime.utcnow 作为当前日期
标签: python sqlite datetime flask