【问题标题】:Custom ID Flask Sql Alchemy自定义 ID Flask Sqlalchemy
【发布时间】:2019-09-15 20:22:02
【问题描述】:

我正在尝试在表中创建自定义 ID。我要的ID:

1909001 1909002

基本上格式是 yymm + 计数器,我想做一个查询来检查模型类中的最后一个 id。尝试使用此 link 中的代码,但仍然没有运气。

class Task(db.Model):
    task_id = db.Column(db.Integer, primary_key=True)
    subject = db.Column(db.String(100), nullable=False)
    request_dt = db.Column(db.DateTime, nullable=False)
    request_detail = db.Column(db.Text, nullable=False)
    requestor = db.Column(db.String(100), nullable=False)

    def get_last_id(self):
        ym = date.today().strftime("%y%m")
        qry = self.query.filter(self.task_id.like("{}".format(ym))).order_by(self.task_id.desc()).first()
        if qry.task_id == '':
            return ym + '001'
        else:
            lastid = qry.task_id
            return "{:02d}".format(int(lastid[-3:]) + 1)

    def __init__(self, subject, req_dt, req_detail, reqtor):
        self.task_id = self.get_last_id()
        self.subject = subject
        self.request_detail = req_detail
        self.request_dt = req_dt
        self.requestor = reqtor

【问题讨论】:

  • 如果一个月有 1000+ 个任务会怎样?您能否详细说明您尝试使用此结构化 id 字段解决的问题?
  • 我认为这不会发生。基本上,我计划将团队中的任务分配从 excel 转移到基于 web 的。到目前为止,一个月最多只能完成 10 个任务。而且我不想更改旧版 ID 格式。

标签: python sqlalchemy flask-sqlalchemy


【解决方案1】:

所以基本上你可以返回 id 表单任务,只需将字符串添加在一起并 zfill id。

def get_last_id():
    qry = Task.query.order_by(Task.id.desc()).first()
    x = qry.id
    ym = date.today().strftime("%y%m")
    q_custom_id = "" + ym + str(x).zfill(3) + ""
    return q_custom_id

# print(Task.get_last_id())

我在数据库中有 3 个 ID,这将打印最后一个,ID 3 将变为:

1909003

希望对你有帮助:P

【讨论】:

    【解决方案2】:

    我编写了一个小型烧瓶应用程序,可以帮助您解决问题。

    您将获得与您尝试获得的格式相同的自定义 ID。

    see the table screenshot

    id  custom_id   subject request_detail  request_dt  request_or  date
    3   1909003 subject_3   request_detail_3    request_dt_3    request_or_3    2019-09-15 02:35:19.661868
    2   1909002 subject_2   request_detail_2    request_dt_2    request_or_2    2019-09-15 02:35:06.191687
    1   1909001 subject_1   request_detail_1    request_dt_1    request_or_1    2019-09-15 02:34:21.406240
    

    app.py

    from datetime import datetime, date
    from flask import Flask, render_template, request, redirect, url_for
    from flask_migrate import Migrate
    from flask_sqlalchemy import SQLAlchemy
    from flask_wtf import FlaskForm, CSRFProtect
    from sqlalchemy import desc
    from wtforms import StringField, SubmitField
    
    app = Flask(__name__)
    
    app.config.from_pyfile('config.py')
    
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    SQLALCHEMY_DATABASE_URI = app.config['SQLALCHEMY_DATABASE_URI']
    
    app.config['SECRET_KEY'] = app.config['SECRET_KEY']
    
    csrf = CSRFProtect(app)
    WTF_CSRF_SECRET_KEY = app.config['SECRET_KEY']
    
    db = SQLAlchemy(app)
    migrate = Migrate(app, db)
    
    
    class Task(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        custom_id = db.Column(db.String(), nullable=False)
        subject = db.Column(db.String(), nullable=False)
        request_detail = db.Column(db.String(), nullable=False)
        request_dt = db.Column(db.String(), nullable=False)
        request_or = db.Column(db.String(), nullable=False)
        date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    
    
        def get_last_id():
    
            qry = Task.query.order_by(Task.id.desc()).first()
            x = qry.id
            ym = date.today().strftime("%y%m")
            q_custom_id = "" + ym + str(x).zfill(3) + ""
    
            return q_custom_id
    
    
        def __init__(self, custom_id, subject, request_detail, request_dt, request_or):
            self.custom_id = custom_id
            self.subject = subject
            self.request_detail = request_detail
            self.request_dt = request_dt
            self.request_or = request_or
    
    
    class TaskForm(FlaskForm):
        subject = StringField(u'subject')
        request_detail = StringField(u'request_detail')
        request_dt = StringField(u'request_dt')
        request_or = StringField(u'request_or')
    
        submit = SubmitField('Save Post')
    
    
    @app.route('/')
    def id_order_task():
        task_id = Task.query.order_by(Task.date.desc())
        return render_template('index.html', task_id=task_id)
    
    
    @app.route('/set-task', methods=['GET', 'POST'])
    def set_task():
        form = TaskForm()
        try:
            get_id = Task.query.order_by(desc('id')).first()
            x: int = get_id.id + 1
            y = date.today().strftime("%y%m")
            if get_id:
                custom_id = "" + y + str(x).zfill(3) + ""
        except:
            custom_id = str(date.today().strftime("%y%m") + str(1).zfill(3))
        finally:
            if request.method == 'POST':
                add_task = Task(
                    custom_id=custom_id,
                    subject=request.form['subject'],
                    request_detail=request.form['request_detail'],
                    request_dt=request.form['request_dt'],
                    request_or=request.form['request_or']
                )
                db.session.add(add_task)
                db.session.commit()
                return redirect(url_for('id_order_task'))
        return render_template('set-task.html', form=form)
    
    
    if __name__ == '__main__':
        app.run()
    

    set-task.html

    <div>
        <form action="{{ url_for('set_task') }}" method="post">
    
            {{ form.csrf_token }}
    
            {{ form.subject.label }}
            {{ form.subject }}
    
            {{ form.request_detail.label }}
            {{ form.request_detail }}
    
            {{ form.request_dt.label }}
            {{ form.request_dt }}
    
            {{ form.request_or.label }}
            {{ form.request_or }}
    
            {{ form.submit }}
        </form>
    </div>
    

    index.html

    <style>
    table {
      border-collapse: collapse;
    }
    table, th, td {
      border: 1px solid black;
    }
    th, td {
      padding: 15px;
      text-align: left;
    }
    </style>
    
      <table>
         <thead>
            <tr>
               <th>id</th>
               <th>custom_id</th>
               <th>subject</th>
               <th>request_detail</th>
                <th>request_dt</th>
                <th>request_or</th>
                <th>date</th>
            </tr>
         </thead>
         <tbody>
            {% for i in task_id %}
               <tr>
                  <td>{{ i.id }}</td>
                  <td>{{ i.custom_id}}</td>
                  <td>{{ i.subject }}</td>
                  <td>{{ i.request_detail }}</td>
               <td>{{ i.request_dt }}</td>
                  <td>{{ i.request_or }}</td>
                  <td>{{ i.date }}</td>
               </tr>
            {% endfor %}
         </tbody>
      </table>
    

    【讨论】:

    • 嗨蒂姆,感谢您的代码。有用!但我只是想知道,我们可以在 Task 类中执行 get_id(检查 DB 中的最后一个 ID)吗?
    • 嗨 Bimo,当我执行以下查询时,我得到了最后一个自定义 ID,我相信应该很容易添加到您的代码中。 qry = Task.query.order_by(Task.custom_id.desc()).first() print(qry.custom_id)
    猜你喜欢
    • 2020-10-10
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2011-08-06
    • 2015-03-25
    • 2019-10-11
    相关资源
    最近更新 更多