Cara menggunakan format api response python

Membuat RESTful API dengan Micro Framework Python, Flask Part 6— Relationship

Halo semua, kembali lagi bersama Kiddy yang lagi asik bahas Flask Python.

Pada tutorial sebelumnya kita membahas cara melakukan Login di Flask, klik link dibawah ini kalo pengen tau.

Sekarang kita akan membahas cara membuat Relationship di Flask.

Relationship ya bukan Rela diboongin ship. 😢 😿

Seperti yang kita ketahui, Relationship ini sering dipake di ORM Eloquent Laravel yaitu

  • HasMany
  • BelongsTo
  • HasOne

Nah Sebenernya Flask juga ada kok. Cuma emang ngga sekeren Eloquent sih hehe.

Oke langsung aja yuk kita mulai, sekarang kita akan membuat lanjutan dari tutorial sebelumnya, jika pada tutorial sebelumnya kita baru membuat routes untuk users saja, sekarang kita akan membuat routes untuk TODOnya, nah pada penekanan relationship ini saya ingin memberi insight cara mengetahui siapa user yang membuat sebuah Todo tersebut. Table todo kan hanya menyimpan user_id saja ya, nah kalo di laravel kita dengan mudah dapat melakukan syntax dibawah ini dengan mudah:

$item->users->name

Namun sayangnya untuk di Flask agak ribet, tapi yaudah yuk kita coba aja duls~

Sebelumnya, edit dulu file modelnya si Todo, yaitu di folder model/todo.py tambahkan variable berikut setelah variable user_id.

users = db.relationship("Users", backref="user_id")

Kita akan membuat relasi dengan table Users sehingga mendapatkan data dari si pembuat Todo. Relasi ini bersifat One to Many, karena satu user bisa memiliki banyak todo, sedangkan setiap todo hanya dimiliki oleh satu user.

Sekarang buat TodoController.py dan copy paste aja seluruh kode saya disini

from app.model.todo import Todos as Todo
from flask import request, jsonify
from app import response, db
from app.controller import UserController

def index():
try:
id = request.args.get('user_id')
todo = Todo.query.filter_by(user_id=id).all()
data = transform(todo)
return response.ok(data, "")
except Exception as e:
print(e)

def store():
try:
todo = request.json['todo']
desc = request.json['description']
user_id = request.json['user_id']

todo = Todo(user_id=user_id, todo=todo, description=desc)
db.session.add(todo)
db.session.commit()

return response.ok('', 'Successfully create todo!')

except Exception as e:
print(e)

def update(id):
try:
todo = request.json['todo']
desc = request.json['description']

todo = Todo.query.filter_by(id=id).first()
todo.todo = todo
todo.description = desc

db.session.commit()

return response.ok('', 'Successfully update todo!')

except Exception as e:
print(e)

def show(id):
try:
todo = Todo.query.filter_by(id=id).first()
if not todo:
return response.badRequest([], 'Empty....')

data = singleTransform(todo)
return response.ok(data, "")
except Exception as e:
print(e)

def delete(id):
try:
todo = Todo.query.filter_by(id=id).first()
if not todo:
return response.badRequest([], 'Empty....')

db.session.delete(todo)
db.session.commit()

return response.ok('', 'Successfully delete data!')
except Exception as e:
print(e)

def transform(values):
array = []
for i in values:
array.append(singleTransform(i))
return array

def singleTransform(values):
data = {
'id': values.id,
'user_id': values.user_id,
'todo': values.todo,
'description': values.description,
'created_at': values.created_at,
'updated_at': values.updated_at,
'user': UserController.singleTransform(values.users, withTodo=False)
}

return data

Lihat, bagian singleTransform kita menambahkan satu parameter baru yaitu user, object user ini akan mengubah values.users alias data dari user yang membuat todo karena pada model user kita menambahkan variable users.

Parameter withTodo akan saya jelaskan nanti.

Udah? Kalo udah coba kita rombak sedikit routes.py kita dan tambahkan routes untuk Todo.

@app.route('/todo', methods=['POST', 'GET'])
def todo():
if request.method == 'GET':
return TodoController.index()
else:
return TodoController.store()

@app.route('/todo/', methods=['PUT', 'GET', 'DELETE'])
def todoDetail(id):
if request.method == 'GET':
return TodoController.show(id)
elif request.method == 'PUT':
return TodoController.update(id)
elif request.method == 'DELETE':
return TodoController.delete(id)

Eits, belom selesai, kita ubah dulu si UserController kita bagian method singleTransform.

def singleTransform(users, withTodo=True):
data = {
'id': users.id,
'name': users.name,
'email': users.email,
}

if withTodo:
todos = []
for i in users.todos:
todos.append({
'id': i.id,
'todo': i.todo,
'description': i.description,
})
data['todos'] = todos

return data

Nah disini kita melihat parameter withTodo. Parameter ini berfungsi untuk menambahkan parameter todos pada saat melihat daftar users dan ingin menampilkan todo list yang dimilikinya. Variable withTodo diset true secara default, lalu menunggu perintah, apabila false ya maka object todos ini tidak akan ditambahkan.

Oke sekarang kita coba jalankan dan coba tambahkan dulu.

Sekarang kita coba dapatkan todo dari user_id 27 milik saya.

Nah kita melihat ada objek user milik saya. Keren kan? Relasi ini dengan mudah dapat kita bangun melalui Flask.

Sekarang coba kalian jalankan routes /users dan lihat hasilnya.

Disana kita melihat satu object bernama todos, todos ini menampilkan seluruh todo list milik user tersebut, user Hudya dan Revkah tidak memiliki todo sedangkan user Kiddy telah memiliki dua todo list.

Mudah kan membuat relasi di Flask? Untuk membuat relasi lainnya kalian dapat temukan pada web dibawah ini.

Kalo gitu adios sampai jumpa goodbye dari saya, semoga semakin semangat belajar Flasknya!

Kalo ada yang mau clone juga saya udah buat nih reponya.

Happy Coding!