DRF - what is that?
It's a simplifier for creating API using Python's Django framework.
You can check my short comparison between different type of Django-supported API frameworks here
Django Rest Framework example project
Initially, I wanted to make my own sample Django REST Framework project that will be used in this tutorial.
Then I've thought to myself- "There must be a better way" (quoting Uncle Bob ^^) - so I've found a repository at GitHub with already predefined simple logic for maintaining TODO-list as an REST-api.
Check it here.
DRF Environment setup
Check out my prepared GitHub-Gist with a simple Linux-commands that you use to prepare your environment HERE.
Checking out the source code of sample project for bulk todo-elements creation.
So first things first - let's check if our code will enable use creation of more than one element using API at once. Let's make a POST request with a list of todos:
[
{"name":"TEST1"},
{"name": "TEs<t2"}
]
The output of it is :
{
"non_field_errors": [
"Invalid data. Expected a dictionary, but got list."
]
}
Means - no. No luck this time :) Let's un-release this and make a bulk of TODOs per one request.
List Serializer
I'm writing this post-heading information after about 3 hours. I've struggled to work with List-Serializer. I tried to use it in a "django" way - but for now, it's beyond my perception. I've found a solution at stackoverflow that after few adoption tricks started to work properly. It's not perfect - but quoting "Done is better than perfect" - I consider it a work-in-progress solution.
I might go back to this and try to investigate how it should be done in more "Django" way
Checkout code:
class TodoBatchAPIView(ListCreateAPIView):
"""
API endpoint that allows multiple members to be created.
"""
queryset = Todo.objects.none()
serializer_class = TodoSerializer
def get_queryset(self):
queryset = Todo.objects.all()
return queryset
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data, many=isinstance(request.data, list))
serializer.is_valid(raise_exception=True)
todo_created = []
for list_elt in request.data:
todo_obj = Todo.objects.create(user=request.user, **list_elt)
todo_created.append(todo_obj.id)
results = Todo.objects.filter(id__in=todo_created)
output_serializer = TodoSerializer(results, many=True)
data = output_serializer.data[:]
return Response(data)
and in urls.py:
url(r'^batch/$', TodoBatchAPIView.as_view(), name="batch"),
Thanks :)
Hope you find this solution valuable.
I for sure will use it in my Biking-Endorphines project.
Please comment and feel free to post your solution to this problem!
Comments
comments powered by Disqus