2016-11-20 54 views
-1

我想根据我将放在URL中的todo_ID在我的数据库中创建一个新任务。我可以完全在数据库中发布一个新任务,但我希望服务器选择todo_ID,因此如果某个人在url中输入/ 1,它将创建一个todo_ID = 1的新任务,并根据哪些内容填写UserID和详细信息用户将在问题是我不知道该怎么办呢基础上,todo_ID所以有人告诉我如何:d使用标识与POST在数据库中创建新任务

from flask import Flask, jsonify,json, request, abort 
from flask_sqlalchemy import SQLAlchemy 

app = Flask(__name__) 
app.config.from_pyfile('Config.py') 
db = SQLAlchemy(app) 


class User(db.Model, JsonModel): #Class which is a model for the User table in the database 
    User_ID = db.Column(db.Integer, primary_key = True) 
    FirstName = db.Column(db.String(20)) 
    LastName = db.Column(db.String(20)) 

    def __init__(self,User_ID,FirstName, LastName): 
     self.User_ID = User_ID 
     self.FirstName = FirstName 
     self.LastName = LastName 

class Todo(db.Model, JsonModel): #Class which is a model for the Todo table in the database 
    todo_ID = db.Column(db.Integer, primary_key = True) 
    UserID = db.Column(db.Integer, db.ForeignKey("user.User_ID")) 
    details = db.Column(db.String(30)) 

    def __init__(self, UserID, details): 
     self.UserID = UserID 
     self.details = details 


    @app.route('/<int:todo_ID>', methods = ['POST']) #Uses POST method with same URL as GET method to add new information to Todo table. 
def create_dev(todo_ID): 
    id = Todo.query.create(todo_ID) 
    dev = request.json["UserID"],request.json["details"] 
    db.session.add(id,dev) 
    db.session.commit() 
    return "New task has been created.", 201 


@app.before_first_request #Creates everything before the first request. 
def startup(): 
    db.create_all() 

if __name__ == '__main__': 
    app.run() 
+0

你肯定在你的URL存在ID的记录? – dirn

+0

ohh ...我以为我本来应该添加一个我以前没有的ID ......我是不是应该有那部分代码?现在我想到了它,它看起来像我需要的东西,如果我正在更新 – Muba

回答

0

尝试

dev.UserID = request.POST["UserID"] 

对于request.json工作,设置内容键入到application/json。从Flask documentation

如果mimetype是application/json,它将包含解析的JSON数据。否则,这将是无。

有关详细信息:https://stackoverflow.com/a/20001283/3930114

编辑1:解决方案基于在评论

@app.route('/<int:todo_ID>', methods = ['POST']) #Uses POST method with same URL as GET method to add new information to Todo table. 
# Setting todo_ID default to None 
def create_dev(todo_ID=None): 
    # This if will allow you to not pass id via url and handle in backend. Frankly, first integer field will automatically become autoincrement field in Flask, so I am not even sure why you want to send todo_ID via url but I dont have enough information about your app :) 
    if todo_ID is None: 
     # write logic to create a todo_ID 
     pass 
    # Instance of model task 
    dev.UserID = request.json["UserID"] 
    dev.details = request.json["details"] 
    t = Task(todo_ID, dev.UserID, dev.details) 
    db.session.add(t) 
    db.session.commit() 
    return "New task has been created with todo_ID: " + todo_ID, 201 

编辑2的讨论:基于在评论其他信息

@app.route('/', methods = ['POST']) #Uses POST method with same URL as GET method to add new information to Todo table. 
# Setting todo_ID default to None 
def create_dev(): 
    # Instance of model task 
    t = Todo(UserID=request.json["UserID"], details=request.json["details"]) 
    db.session.add(t) 
    db.session.commit() 
    return "New task has been created with todo_ID: " + todo_ID, 201 

PS解决方案:我没有测试过这个代码。

参考文献:

+0

哦,我想我搞砸了我的代码,因为我无法寻找我试图制作的新ID,因为它没有'尚未完成。现在的主要问题是我不知道如何根据todo_ID发布数据。同样在我的curl语句中,我放入了application/json,它在我尝试输入新的todo_ID时起作用,但我希望服务器选择todo_ID,因此不必输入它。 – Muba

+0

看起来你有几个单独的问题,如果这是一个正确的理解,在原始问题中没有表示,请问您可以编辑原始问题吗? >现在的主要问题是我不知道如何根据todo_ID发布数据。 你似乎在做正确的事情。 对于第二个问题,你试图编辑一个任务还是创建一个新的?如果进行编辑,服务器可以使用什么标准来获取todo_ID?否则,服务器应该拿起自动值或尝试使用从'路线' – Aditya

+0

'我的主要问题是能够根据todo_ID发布数据。我正在尝试创建一项新任务。我想出了如何编辑已有的任务。 – Muba

相关问题