Desarrollo del Backend para un E-Commerce con Django Rest Framework
1. Configuración Inicial del Proyecto
1.1. Crear un Proyecto Django
Abre tu terminal y ejecuta los siguientes comandos para crear un nuevo proyecto Django:
python -m venv env
source env/bin/activate
pip install django==4.2
django-admin startproject ecommerce_project .
cd ecommerce_project
1.2 Crear una Aplicación Django
Dentro del directorio del proyecto, crea una aplicación para manejar el e-commerce:
python manage.py startapp products
1.3 Instalar Django Rest Framework
Instala DRF usando pip:
pip install djangorestframework
1.4 Configurar el Proyecto
Añade ‘rest_framework’ y tu nueva aplicación ‘products’ a la lista INSTALLED_APPS en ecommerce_project/settings.py:
= [
INSTALLED_APPS # ... otras apps
'rest_framework',
'products',
]
2. Definir el Modelo de Datos
2.1 Crear Modelos en products/models.py
Define los modelos para el e-commerce, como Product, Category, y Order:
from django.db import models
class Category(models.Model):
= models.CharField(max_length=100)
name
def __str__(self):
return self.name
class Product(models.Model):
= models.CharField(max_length=100)
name = models.TextField()
description = models.DecimalField(max_digits=10, decimal_places=2)
price = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE)
category = models.PositiveIntegerField()
stock
def __str__(self):
return self.name
class Order(models.Model):
= models.ForeignKey(Product, related_name='orders', on_delete=models.CASCADE)
product = models.PositiveIntegerField()
quantity = models.DecimalField(max_digits=10, decimal_places=2)
total_price = models.DateTimeField(auto_now_add=True)
order_date
def __str__(self):
return f"Order {self.id} - {self.product.name}"
2.2 Crear y Aplicar Migraciones
Genera y aplica las migraciones para los modelos:
python manage.py makemigrations
python manage.py migrate
3. Crear Serializers
3.1 Definir Serializers en products/serializers.py
Los serializers se encargan de transformar los modelos en formatos JSON y viceversa:
from rest_framework import serializers
from .models import Category, Product, Order
class CategorySerializer(serializers.ModelSerializer):
class Meta:
= Category
model = '__all__'
fields
class ProductSerializer(serializers.ModelSerializer):
= CategorySerializer()
category
class Meta:
= Product
model = '__all__'
fields
class OrderSerializer(serializers.ModelSerializer):
= ProductSerializer()
product
class Meta:
= Order
model = '__all__' fields
4. Crear Vistas y Rutas
4.1 Definir Vistas en products/views.py
Utiliza las vistas basadas en clases de DRF para crear y manejar las operaciones CRUD:
from rest_framework import generics
from .models import Category, Product, Order
from .serializers import CategorySerializer, ProductSerializer, OrderSerializer
class CategoryListCreate(generics.ListCreateAPIView):
= Category.objects.all()
queryset = CategorySerializer
serializer_class
class CategoryDetail(generics.RetrieveUpdateDestroyAPIView):
= Category.objects.all()
queryset = CategorySerializer
serializer_class
class ProductListCreate(generics.ListCreateAPIView):
= Product.objects.all()
queryset = ProductSerializer
serializer_class
class ProductDetail(generics.RetrieveUpdateDestroyAPIView):
= Product.objects.all()
queryset = ProductSerializer
serializer_class
class OrderListCreate(generics.ListCreateAPIView):
= Order.objects.all()
queryset = OrderSerializer
serializer_class
class OrderDetail(generics.RetrieveUpdateDestroyAPIView):
= Order.objects.all()
queryset = OrderSerializer serializer_class
4.2 Configurar Rutas en products/urls.py
Define las rutas para acceder a las vistas:
from django.urls import path
from . import views
= [
urlpatterns 'categories/', views.CategoryListCreate.as_view(), name='category-list-create'),
path('categories/<int:pk>/', views.CategoryDetail.as_view(), name='category-detail'),
path('products/', views.ProductListCreate.as_view(), name='product-list-create'),
path('products/<int:pk>/', views.ProductDetail.as_view(), name='product-detail'),
path('orders/', views.OrderListCreate.as_view(), name='order-list-create'),
path('orders/<int:pk>/', views.OrderDetail.as_view(), name='order-detail'),
path( ]
4.3 Incluir las URLs en ecommerce_project/urls.py
Añade las URLs de la aplicación al archivo principal de URLs del proyecto:
from django.contrib import admin
from django.urls import path, include
= [
urlpatterns 'admin/', admin.site.urls),
path('api/', include('products.urls')),
path( ]
5. Probar la API
5.1 Ejecutar el Servidor de Desarrollo
Inicia el servidor de desarrollo de Django:
python manage.py runserver
5.2 Probar los Endpoints
Utiliza herramientas como Postman o cURL para probar los endpoints:
- Listar categorías: GET /api/categories/
- Crear categoría: POST /api/categories/
- Obtener categoría específica: GET /api/categories/{id}/
- Actualizar categoría: PUT /api/categories/{id}/
- Eliminar categoría: DELETE /api/categories/{id}/
Y lo mismo para productos y pedidos.
- Listar productos: GET /api/products/
- Crear producto: POST /api/products/
- Obtener producto específico: GET /api/products/{id}/
- Actualizar producto: PUT /api/products/{id}/
- Eliminar producto: DELETE /api/products/{id}/
Extra
Agreguemos Swagger a nuestro proyecto para tener una documentación de nuestra API.
1. Instalar Django Rest Swagger
Instala Django Rest Swagger usando pip:
pip install drf-yasg
2. Configurar Django Rest Swagger
Añade ‘rest_framework_swagger’ a la lista INSTALLED_APPS en ecommerce_project/settings.py:
from django.contrib import admin
from django.urls import path, include
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
= get_schema_view(
schema_view
openapi.Info(="E-commerce API",
title='v1',
default_version="API documentation for the E-commerce project",
description="https://www.google.com/policies/terms/",
terms_of_service=openapi.Contact(email="contact@ecommerce.local"),
contact=openapi.License(name="BSD License"),
license
),=True,
public=(permissions.AllowAny,),
permission_classes
)
= [
urlpatterns 'admin/', admin.site.urls),
path('api/', include('products.urls')),
path('docs/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
path('redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
path( ]
3. Configurar las URLs
Añade las URLs de Swagger al archivo principal de URLs del proyecto:
´´´from rest_framework_swagger.views import get_swagger_view
= get_swagger_view(title='E-Commerce API')
schema_view
= [
urlpatterns
´´´'docs/', schema_view),
path( ]
Para evitar un error común es necesario instalr setuptools con el siguiente comando:
pip install setuptools
Finalmente es necesario agregar el siguiente código al final del archivo settings.py
= [
INSTALLED_APPS 'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'drf_yasg',
'rest_framework',
'products',
]
´´´= {
REST_FRAMEWORK 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema'
}
= [
CORS_ALLOWED_ORIGINS "http://localhost:8000",
"http://127.0.0.1:8000",
# Añade otros orígenes permitidos aquí
]