我正在开发一个 API,它使用 Flask、、、flask_sqlalchemy
和flask_marshmallow
序列flask_restful
化数据并将数据存储在数据库中。
我有大约 15 个模型,除了这个之外,它们都可以工作:
class Student(db.Model):
__tablename__ = 'student'
studentId = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String(50))
email = db.Column(db.String(50))
courses = db.relationship("StudentCourses")
connected = db.Column(db.Boolean)
def __repr__(self):
return "Student Id : {}, Name: {}, Email: {}, Courses: {}, Connected: {}".format(self.studentId, self.name, self.email, self.courses, self.connected)
# Marshmellow Schema
class StudentSchema(ma.Schema):
class Meta:
fields = ("studentId", "name", "email", "courses", "connected")
# Schema for Multiple Students
students_schema = StudentSchema(many = True)
# Schema for Individual Students
student_schema = StudentSchema()
class StudentListResource(Resource):
def get(self):
posts = Student.query.all()
# the posts are stored in the database but it only returns the name
for i in posts:
print(i)
return students_schema.dump(posts)
def post(self):
connection = False
if request.json['connected'] == "True" or request.json['connected'] == 'true':
connection = True
newStudent = Student(
name = request.json['name'],
email = request.json['email'],
connected = connection
)
db.session.add(newStudent)
db.session.commit()
return student_schema.dump(newStudent)
class StudentResource(Resource):
def get(self, studentId):
student = Student.query.get_or_404(studentId)
return student_schema.dump(student)
def patch(self, studentId):
student = Student.query.get_or_404(studentId)
if 'studentId' in request.json:
student.studentId = request.json['studentId']
if 'name' in request.json:
student.name = request.json['name']
if 'email' in request.json:
student.email = request.json['email']
if 'connected' in request.json and (request.json['connected'] == 'True' or request.json['connected'] == 'true'):
student.connected = True
db.session.commit()
return student_schema.dump(student)
def delete(self, studentId):
student = studentId.query.get_or_404(studentId)
db.session.delete(student)
db.session.commit()
return '', 204
# Registering the Endpoints
api.add_resource(StudentListResource, '/students')
api.add_resource(StudentResource, '/students/<int:studentId>')
运行插入时使用:
curl http://localhost:5000/students \
-X POST \
-H "Content-Type: application/json" \
-d '{"name":"dean", "email":"test@dean.com", "connected":"True"}
它插入整行但只返回名称字段:
{
"name": "dean"
}
正确的输出应如下所示:
{
"studentId": "1", "name": "dean", "email": "test@dean.com", "connected":"true"
}
我不知道为什么会这样,因为我有一个几乎相同的模式,称为教师,它可以正确返回并插入整行。它看起来像这样:
# TEACHER
class Teacher(db.Model):
__tablename__ = 'teacher'
teacherId = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String(50))
email = db.Column(db.String(50))
courses = db.relationship("TeacherCourses")
connected = db.Column(db.Boolean)
def __repr__(self):
return "Teacher Id : {}, Name: {}, Email: {}, Courses: {}, Connected: {}".format(self.teacherId, self.name, self.email, self.courses, self.connected)
# Marshmellow Schema
class TeacherSchema(ma.Schema):
class Meta:
fields = ("teacherId", "name", "email", "courses", "connected")
# Schema for Multiple Teachers
teachers_schema = TeacherSchema(many = True)
# Schema for Individual Teachers
teacher_schema = TeacherSchema()
class TeacherListResource(Resource):
def get(self):
posts = Teacher.query.all()
return teacher_schema.dump(posts)
def post(self):
connection = False
if request.json['connected'] == "True" or request.json['connected'] == 'true':
connection = True
newTeacher = Teacher(
name = request.json['name'],
email = request.json['email'],
connected = connection
)
db.session.add(newTeacher)
db.session.commit()
return teacher_schema.dump(newTeacher)
class TeacherResource(Resource):
def get(self, teacherId):
teacher = Teacher.query.get_or_404(teacherId)
return teacher_schema.dump(teacher)
def patch(self, teacherId):
teacher = Teacher.query.get_or_404(teacherId)
if 'teacherId' in request.json:
teacher.teacherId = request.json['teacherId']
if 'name' in request.json:
teacher.name = request.json['name']
if 'email' in request.json:
teacher.email = request.json['email']
if 'connected' in request.json and (request.json['connected'] == 'True' or request.json['connected'] == 'true'):
teacher.connected = True
db.session.commit()
return teacher_schema.dump(teacher)
def delete(self, teacherId):
teacher = teacherId.query.get_or_404(teacherId)
db.session.delete(teacher)
db.session.commit()
return '', 204
# Registering the Endpoints
api.add_resource(TeacherListResource, '/teachers')
api.add_resource(TeacherResource, '/teachers/<int:teacherId>')
此模式可以正确地返回并返回为:
curl http://localhost:5000/teachers \
-X POST \
-H "Content-Type: application/json" \
-d '{"name":"brian", "email":"test@dean.com", "connected":"True"}'
{
"teacherId": 2,
"email": "test@dean.com",
"name": "brian",
"courses": [],
"connected": true
}
任何帮助是极大的赞赏!