首页 > 解决方案 > 如何将单个日期与 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']):

我希望有人可以帮助我,因为我不是专业人士而是初学者

提前致谢!

标签: pythonsqlitedatetimeflask

解决方案


看起来您可能有几个间距问题。如果您没有适当的间距,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!!!"

推荐阅读