【问题标题】:How to compare single Dates with Flask, SQLAlchemy, SQLite如何将单个日期与 Flask、SQLAlchemy、SQLite 进行比较
【发布时间】: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


【解决方案1】:

看起来您可能有几个间距问题。如果您没有适当的间距,Python 不喜欢它。尝试这个。此外,我不确定您想要最后的 return 语句在哪里,所以我不确定我的间距是否正确。

@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!!!"

【讨论】:

  • 如果少于 90 天则没有捐赠或超过 90 天有资格捐赠,它正在寻找从上次捐赠到展示天数之间的差异
  • TypeError: 不支持的操作数类型 -: 'BaseQuery' 和 'datetime.date'
  • 我收到了这个错误,因为我正在尝试使用以下语句从我的数据库中存储和获取 next_donation 日期:next_bd_date = db.session.query(BloodDonation).filter(func.DATE(BloodDonation.latest_donation) &gt;= 0)
猜你喜欢
  • 2019-12-10
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
相关资源
最近更新 更多