[Django] Graphql 기반 - Create, Update 본문

[PL]/Python

[Django] Graphql 기반 - Create, Update

객과 함께. 2021. 9. 16. 18:00

todo 프로그램으로 create, update, delete를 정리 합니다. 

1. graphql에서 mutate로 질의에 사용.

2. delete class는 update class 같이 사용 하였다. 

3. 출처 : www.twilio.com 에서 참고하였음.

 

todos/models.py

from django.db import models
class TodoItem(models.Model) :
    id = models.BigAutoField(primary_key=True)
    content = models.CharField(max_length=350)
    create_date = models.DateTimeField(auto_now_add=True )  
    done = models.BooleanField(default=False)
    delyn_date = models.DateTimeField(auto_now=True )  
    delyn = models.BooleanField(default=False)    
    class Mata :
        ordering = ['done', '-id']

1. 인덱스 키인 'id'는 auto_increment 하도록 하였음.

2. view 단에서 보여질때 소트 된 역순으로 보여질 것이다. 

 

todos/urls.py

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

 

todos/schema.py

from graphene_django import DjangoObjectType
from .models import TodoItem
from django.utils import timezone
import graphene
class Todo(DjangoObjectType) :
    class Meta:
        model = TodoItem

 클라이언트가 API를 통해 데이터를 추가하거나 변경할 수 있도록  필드를 정의 하였다.

class TodosInput (graphene.InputObjectType) :
    id = graphene.ID()
    content = graphene.String()
    create_date = graphene.DateTime()
    done = graphene.Int()
    delyn_date = graphene.DateTime()
    delyn = graphene.Int()

1) Create class

# create class  
class CreateTodos(graphene.Mutation) :
    class Arguments:
        todo_data = TodosInput(required=True)        
    todo = graphene.Field(Todo)    
    @staticmethod
    def mutate(root, info,todo_data=None ) :  
        todos_insert = TodoItem(
            content = todo_data.content,
            uid = todo_data.uid
        )
        todos_insert.save()
        return CreateTodos(todo=todos_insert)

2) Update class / Delete class 

# update class / delete class
class UpdateTodos(graphene.Mutation) :
    class Arguments :
        todos_data = TodosInput(required=True)
    todo = graphene.Field(Todo)    
    @staticmethod
    def mutate(root, info, todos_data=None) :
        todo_instance = TodoItem.objects.get(pk=todos_data.id)
        if todo_instance :
            todo_instance.content = todo_instance.content  if todos_data.content is None else todos_data.content
            todo_instance.done = todos_data.done			# update
	    todo_instance.delyn = todos_data.delyn			# delete 
            todo_instance.save()
            return UpdateTodos(todo=todo_instance)
        return UpdateTodos(todo=None)
class Mutation(graphene.ObjectType) :
    create_todos = CreateTodos.Field()
    update_todos = UpdateTodos.Field()
    deletedate_todos = DeleteTodos.Field()
schema = graphene.Schema(query=TodoQuery, mutation=Mutation)

delete class sms "DeleteTodos"로 만들면 된다. (코드가 중복이 되어 하나만 올렸음.) 

 

 

'[PL] > Python' 카테고리의 다른 글

[Python] for loop관련 예제  (0) 2022.01.25
Django-allauth 설정 및 작성  (0) 2022.01.13
[Django] Django ORM  (0) 2021.09.13
Graphql기반한 CRUD중 - Select  (0) 2021.09.13
[Django] Django ORM  (0) 2021.09.13