Skip to content

Latest commit

 

History

History

Ejemplo-02

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

Backend con Python > Sesión 07 > Ejemplo-02

Definiendo esquemas para crear un API GraphQL y realizar consultas de datos

OBJETIVOS

  • 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

REQUISITOS

  1. Actualizar repositorio
  2. Usar la carpeta de trabajo Sesion-07/Ejemplo-02
  3. Activar el entorno virtual Bedutravels
  4. Diagrama de entidad-relación del proyecto Bedutravels Diagrama entidad-relación
  5. Carpeta de proyecto Ejemplo-02/Bedutravels/ con los siguientes datos de acceso al admin de Django :
    • Usuario: bedutravels
    • Clave: bedutravels

DESARROLLO

  1. 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',
    ]

  2. Se crea la ruta para la url /graphql modificando el archivo Bedutravels/tours/urls.py:

    from django.urls import path
    from graphene_django.views import GraphQLView
    
    urlpatterns = [
        path('graphql', GraphQLView.as_view(graphiql=True)),
    ]

  3. 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 Zona

    import 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)   

  4. Acceso y uso de la API /graphql

    Para tener acceso al API abrir la siguiente url:

    http://localhost:8000/graphql

    Se deberá de observar algo similar a lo siguiente:

    Bedutravels API GraphQL

    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:

    allUser id 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:

    allUser id, nombre, genero

    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:

    allUser, allZona