Tutorial REST API + Django RestFramework Python + PostgreSQL

En este tutorial vamos a aprender a crear una API REST CRUD usando Django Rest Framework y la base de datos MySQL. Crearemos una API REST que desarrolle las peticiones CRUD (Create, Read, Update, Delete) usando el Framework Backend de Python Django.

1 – Crear entorno virtual

python -m venv venv
Activar
#windows 
venv\Scripts\activate.bat
#linux or mac
source venv/bin/activate

2 – Instalar Django

pip install django djangorestframework

3 – Iniciar proyecto

django-admin startproject tutofox
cd tutofox

4 – Instalar PostgreSQL

pip install psycopg2

Configurar conexión

tutofox\settings.py

...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'tutofox',
        'USER': 'postgres',
        'PASSWORD': '12345',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

...

5 – Migrate

python manage.py migrate

6 – Crear app

django-admin startapp person

Configurar app

tutofox\settings.py

...

INSTALLED_APPS = [
 	...
    'rest_framework',
    'person'
]

...

7 – Model

person\models.py

from django.db import models
 
class PersonModel(models.Model):
    name = models.CharField(max_length=255)
    address = models.TextField()
    phone = models.BigIntegerField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = "person"
        ordering = ['-created_at']

8 – Serialize

person\serializers.py

from rest_framework.serializers import ModelSerializer
from person.models import PersonModel


class PersonSerializer(ModelSerializer):
    class Meta:
        model = PersonModel
        fields = ['id', 'name', 'address', 'phone']
        #fields = '__all__'

9 – Views

person\views.py

from rest_framework import status
from rest_framework.views import APIView 
from rest_framework.response import Response
from person.models import PersonModel
from person.serializers import PersonSerializer 

class PersonApiView(APIView):
    def get(self, request):
        serializer = PersonSerializer(PersonModel.objects.all(), many=True)
        return Response(status=status.HTTP_200_OK, data=serializer.data)
    def post(self, request): 
        #res = request.data.get('name')  
        serializer = PersonSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(status=status.HTTP_200_OK, data=serializer.data)

class PersonApiViewDetail(APIView):
    def get_object(self, pk):
        try:
            return PersonModel.objects.get(pk=pk)
        except PersonModel.DoesNotExist:
            return None
    def get(self, request, id):
        post = self.get_object(id)
        serializer = PersonSerializer(post)  
        return Response(status=status.HTTP_200_OK, data=serializer.data)
    def put(self, request, id):
        post = self.get_object(id)
        if(post==None):
            return Response(status=status.HTTP_200_OK, data={ 'error': 'Not found data'})
        serializer = PersonSerializer(post, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(status=status.HTTP_200_OK, data=serializer.data) 
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    def delete(self, request, id):
        post = self.get_object(id)
        post.delete()
        response = { 'deleted': True }
        return Response(status=status.HTTP_204_NO_CONTENT, data=response)

9 – Urls

person\urls.py

from django.urls import path
from person.views import PersonApiView, PersonApiViewDetail
  
urlpatterns_persons = [
    path('v1/persons', PersonApiView.as_view()), 
    path('v1/persons/<int:id>', PersonApiViewDetail.as_view()), 
]

tutofox\urls.py

from django.contrib import admin
from django.urls import path, include
from person.urls import urlpatterns_persons

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include(urlpatterns_persons)),
]

10 – Start API Server

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *