Backend con Python
> Sesión 07
> Ejemplo-02
- Configurar Django Graphene
- Definir la url única para el acceso a todo el API GraphQL
- Integrar Django Graphene en el proyecto
- Definir el esquema para las consultas con GraphQL
- Realizar operaciones de consulta vía API GraphQL
- Actualizar repositorio
- Usar la carpeta de trabajo
Sesion-07/Ejemplo-02
- Activar el entorno virtual Bedutravels
- Diagrama de entidad-relación del proyecto Bedutravels
- Carpeta de proyecto
Ejemplo-02/Bedutravels/
con los siguientes datos de acceso al admin de Django :- Usuario: bedutravels
- Clave: bedutravels
-
Agregando Django Graphene a la configuración en el archivo
settings.py
como una aplicación adicional:INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'tours', 'graphene_django', ]
-
Se crea la ruta para la url
/graphql
modificando el archivoBedutravels/tours/urls.py
:from django.urls import path from graphene_django.views import GraphQLView urlpatterns = [ path('graphql', GraphQLView.as_view(graphiql=True)), ]
-
Se crea el esquema (schema) en el archivo
Bedutravels/tours/schema.py
para atender las consultas que obtiene la lista de todos los registros de los modelos User y Zonaimport graphene from graphene_django.types import DjangoObjectType from .models import User, Zona, Tour, Opinion, Salida
Cada campo que será usando en la consulta, se define mediante un tipo de dato por medio de una clase que hereda de DjangoObjectType y además es la encargada de crear el vínculo con el modelo correspondiente.
A continuación se muestran la definición de los tipos UserType y ZonaType.
class UserType(DjangoObjectType): """ Tipo de dato para manejar el tipo User """ class Meta: # Se relaciona con el origen de la data en models.User model = User class ZonaType(DjangoObjectType): """ Tipo de dato para manejar el tipo Zona """ class Meta: # Se relaciona con el origen de la data en models.Zona model = Zona
Observar como en cada clase se vincula el modelo correspondiente.
Después se crea la clase que atenderá las consultas realizadas desde el API:
class Query(graphene.ObjectType): """ Definición de las respuestas a las consultas posibles """ # Se definen los posibles campos en las consultas all_users = graphene.List(UserType) # allUsers all_zonas = graphene.List(ZonaType) # allZonas # Se define las respuestas para cada campo definido def resolve_all_users(self, info, **kwargs): # Responde con la lista de todos registros return User.objects.all() def resolve_all_zonas(self, info, **kwargs): # Responde con la lista de todos registros return Zona.objects.all()
Finalmente se crea la variable
schema
que define el esquema de los posibles campos y consultas.# Se crea un esquema que hace uso de la clase Query schema = graphene.Schema(query=Query)
-
Acceso y uso de la API
/graphql
Para tener acceso al API abrir la siguiente url:
Se deberá de observar algo similar a lo siguiente:
Obteniendo la lista de todos los registros del modelo User:
Escribir la siquiente consulta (query) en formato GraphQL en la región izquierda remplazando cualquier contenido existente:
query { allUsers { id } }
luego dar click en el botón de reproducir (play), el resultado se mostrará en la región derecha similar al siguiente:
Se puede observar como el resultado incluye los tres registros en el modelo User, pero sólo se ha obtenido el id, esto es porque en la consulta así se ha solicitado, entonces ahora se solicitará también el nombre y el genero, se da click en reproducir (play) y se obtiene algo similar a:
Ahora también obteniendo la lista de todos los registros del modelo Zona con la siguiente consulta:
query { allUsers { id nombre genero } allZonas { id nombre } }
El resultado será similar a: