La separación de la lógica de backend y frontend es una práctica común en el desarrollo de software moderno, con el frontend generalmente escrito en JavaScript y la conexión al backend manejada a través de APIs. Django REST es una librería de Python que facilita la creación de estas APIs, permitiendo una integración eficiente entre frontend y backend.
¿Cómo instalar Django REST Framework?
Para instalar Django REST Framework, utilizamos el siguiente comando:
pip install django-rest-framework
No olvides agregarlo a tu archivo requirements.txt para mantener un registro de las dependencias del proyecto. Además, debes incluirlo en la configuración del proyecto dentro del archivo settings.py en la sección de INSTALLED_APPS:
INSTALLED_APPS =[...'rest_framework',]
¿Cómo configurar un Serializer en Django REST?
Los Serializers en Django REST convierten modelos de Django en JSON. Para crear un nuevo Serializer, sigue estos pasos:
Crea un archivo llamado serializers.py en la aplicación correspondiente.
Importa ModelSerializer desde rest_framework:
from rest_framework import serializers
from.models import Product
classProductSerializer(serializers.ModelSerializer):classMeta: model = Product
fields ='__all__'
¿Cómo crear una vista en Django REST?
Para crear una vista que devuelva datos en formato JSON:
excelente curso, seria genial que pronto, mas pronto de lo posible, creen otro para rest framework ya que el standard es la separacion del frontend con el backend
Estamos trabajando en ese curso! Muchas gracias por tu comentario
Buenas. Por aqui anexo mi solución en donde cree todo el crud del api de productos. Tanto los metodos como GET, POST, PATCH y DELETE fueron creados.
classProductListAPI(APIView): authentication_classes =[] permission_classes =[]defget(self, request, pk=None,format=None):id= pk
ifidisnotNone:try: product_id = Product.objects.get(id=id) serializer = ProductSerializer(product_id)return Response(serializer.data)except Exception as error:return Response({'msg':'Product Was not found'}, status=status.HTTP_404_NOT_FOUND
) products = Product.objects.all() serializer = ProductSerializer(products, many=True)return Response(serializer.data)defpost(self, request, pk=None,format=None): serializer = ProductSerializer(data=request.data)if serializer.is_valid(): serializer.save()return Response({'msg':'Product Created'}, status=status.HTTP_201_CREATED
)return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST
)defpatch(self, request, pk=None,format=None):id= pk
try: product_id = Product.objects.get(pk=id) serializer = ProductSerializer( product_id, data=request.data, partial=True)if serializer.is_valid(): serializer.save()return Response({'msg':'Product Updated'}, status=status.HTTP_201_CREATED
)return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST
)except Exception as error:return Response({'msg':'Product Was not found'}, status=status.HTTP_404_NOT_FOUND
)defdelete(self, request, pk=None,format=None):id= pk
try: product_id = Product.objects.get(pk=id) product_id.delete()return Response({'msg':'Product Deleted'}, status=status.HTTP_200_OK
)except Exception as error:return Response({'msg':'Product Was not found'}, status=status.HTTP_404_NOT_FOUND
)```Tambien tuve que afectar el archivo de URLS de los productos:
```python
from django.contrib import admin
from django.urls import path
from.views import ProductFormView, ProductListView, ProductListAPI
urlpatterns =[ path('', ProductListView.as_view(), name="products_list"), path('agregar/', ProductFormView.as_view(), name="add_product"), path('api/', ProductListAPI.as_view(), name="list_product_api_1"), path('api/<int:pk>', ProductListAPI.as_view(), name="list_product_api")]```y le agregue el id al serializer de producto.
```python
from rest_framework.serializers import ModelSerializer
from.models import Product
classProductSerializer(ModelSerializer):classMeta: model = Product
fields =["id",'name','description','price','available','photo']#fields = '__all__'```Notese que al serialize se le puede agregar el valor \_\_all\_\_ para traerse todos los campos de la bd del modelo (en este caso lo comente para tenerlo como referencia).
no se si es lo mejor, pero yo siempre antes de un push solo hago un pip freeze > requirements.txt, asi evito tener pendiente estar pegando y buscando cada uno
Es correcto, pero de este modo se listan todas las dependencias, incluyendo las que no deberían ir a producción y que solamente utilizamos para el desarrollo. También se listan aquellas dependencias que se instalan como requerimiento de otra dependencia y que de igual modo no es necesario listarlas en nuestro archivo de requerimientos.
No se si es lo mejor, pero yo antes de cada push solo hago un: ```js
pip freeze > requirements.txt
Hola Chicos, Aqui dejo algunos curls commands para que prueben su endpoint '/api/products/':
\nRecuerden que deben tener los metodos ya en su classe ProductListAPI, pueden ajustar los campos de acuerdo a com otengan sus productos definidos en ./models.py y db.
¿Qué sentido tiene hoy en día usar solo Django sin la librería REST Framework, ya que la tendencia del Backend es tener la responsabilidad de crear una API y no tener lógica de la vista?
En algunos casos la implementación de una app puede ser más compleja si se requiere tener dos proyectos (El front y el back) en Django tenemos la posibilidad de tener todo en uno solo, esto es útil en algunos proyectos y hay que tener cuidado al usarlo. Si se es organizado se puede dar mucho soporte sin separarlo y si la empresa escala y en el futuro se tiene que dividir en dos proyectos se podría hacer fácil.
No se ha podido resolver la importación "rest_framework.views".
Ya instale el paquete
pip install django-rest-framework
Ya agregue en las aplicaciones , el entorno es correcto pero Visual Studio no lo reconoce ni recargando ni nada
Django==4.2.30
Python 3.8
djangorestframework==3.13.1
La version de djangorestframework en este ejemplo no es la 3.15.2?
Asi quedo mi solución:
@method_decorator(csrf_exempt, name='dispatch')classProductListAPI(APIView): authentication_classes =[] permission_classes =[] def get(self, request): products =Product.objects.all() serializer =ProductSerializer(products, many=True)returnResponse(serializer.data) def post(self, request): serializer =ProductSerializer(data=request.data)if serializer.is_valid(): serializer.save() # Guarda los productos si los datos son validos
returnResponse(serializer.data, status=status.HTTP_201_CREATED)returnResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)```@method\_decorator(csrf\_exempt, name='dispatch')classProductListAPI(APIView): authentication\_classes = \[] permission\_classes = \[] def get(self, request): products =Product.objects.all() serializer =ProductSerializer(products, many=True)returnResponse(serializer.data) def post(self, request): serializer =ProductSerializer(data=request.data)if serializer.is\_valid(): serializer.save() # Guarda los productos si los datos son validos returnResponse(serializer.data, status=status.HTTP\_201\_CREATED)returnResponse(serializer.errors, status=status.HTTP\_400\_BAD\_REQUEST)
Un poco de ayuda de Chat GPT en la vistas, lo admito...
serializers.py:
from rest\_framework.serializers import ModelSerializerfrom .models import OrderProduct
classOrderProductSerializer(ModelSerializer):classMeta: model = OrderProduct fields = \["product","quantity",]
Models: Define the structure of the data in the database. They represent the tables in the database and the fields within those tables. Models are used to interact with the database, perform queries, and manage the lifecycle of data records.
Serializers: Define how data should be converted between complex types (e.g., model instances) and native Python data types (e.g., dictionaries). They are used to validate, transform, and render data for APIs.
Usage:
Models: Used for database operations such as creating, reading, updating, and deleting records. They are part of the Django ORM and are essential for defining the data schema.
Serializers: Used for API operations such as validating input data, transforming data into JSON or other formats, and rendering data for HTTP responses. They are part of the Django REST Framework and are essential for building APIs.
Validation:
Models: Provide basic validation for field types and constraints (e.g., max_length, unique). However, they do not handle complex validation logic.
Serializers: Provide comprehensive validation for input data, including complex validation logic, nested serializers, and custom validation methods.
Data Transformation:
Models: Do not handle data transformation for APIs. They represent the data as it is stored in the database.
Serializers: Handle data transformation for APIs. They convert complex data types into native Python data types and vice versa.
Importance of Using Serializers in Django
Data Validation:
Serializers provide a way to validate and sanitize input data. They ensure that the data received from clients (e.g., via HTTP requests) meets the required format and constraints before it is processed or saved to the database.
Data Transformation:
Serializers convert complex data types, such as querysets and model instances, into native Python data types that can be easily rendered into JSON, XML, or other content types. This transformation is essential for sending data over the network.
Consistency:
Serializers help maintain consistency in the data format across different parts of the application. They ensure that the data is always in the expected format, making the application more predictable and easier to debug.
Security:
By validating and sanitizing input data, serializers help prevent common security issues such as SQL injection and cross-site scripting (XSS). They ensure that only valid and safe data is processed by the application.
Reusability:
Serializers can be reused across different views and endpoints, reducing code duplication and making the application more modular.
Saludos, qué puedo hacer si al importar ModelSerializer recibo este error: Import "rest_framework.seralizer" could not be resolvedPylance<u>reportMissingImports</u>
A mi me pasó lo mismo, en mi caso el problema fue seleccionar el interprete correcto:
En VSC abre la paleta de comandos (Ctrl + Shift + P en Windows/Linux, Cmd + Shift + P en macOS).
Escribe Python: Select Interpreter y selecciona el intérprete Python correcto donde tienes instalado Django y djangorestframework.
Woe, el profe luis no decepciona, que excelente curso de django.
por favor maestro haga un curso sobre django channels
Django Channels es una muy buena libreria para manejor de sockets.
Hoy en dia es más común usar Js o Golang para manejor de sockets, pero tendré en cuenta este comentario!
Pa cuando un cursito que integre DRF con Next😉
Vamos a tener un Curso de Django Rest, para integrarte a una API rest con Next puedes hacer el curso de Next, todas las API se integran igual independientemente de como están construidas.
No he podido usar la libreria de reest_framework, tengo todas las configuraciones iguales, pero no me permite usarlan dice:
Al parecer no estas usando el compilador de python de tu venv
¿Pero ejecutaste antes de hacer la pregunta? porque el Pylance dice eso probablemente porque el intérprete no es el correcto (la versión de python me refiero).