Graphene-django 정리
1. Model의 related_name으로 가져오려면
예를 들어 ItemModel과 SubItemModel 모델이 있고 SubItemModel에서
item = models.ForeignKey(ItemModel, related_name='SubItems')
예를 들어 ItemModel과 SubItemModel 모델이 있고 SubItemModel에서
item = models.ForeignKey(ItemModel, related_name='SubItems')
처럼 정의했다면, schema에서 SubItem(이름은 상관없다. 모델을 Query 클래스에서 가져오기 위한 클래스)을 만들어야 Item 안에서 related_name으로 찾아올 수 있다.
실제로 SubItem을 Query 클래스에서 사용하지 않아도 만들어야 한다.
실제로 SubItem을 Query 클래스에서 사용하지 않아도 만들어야 한다.
2. Self reference
schema의 어떤 클래스에서 같은 클래스를 리턴하는 쿼리는 사용할 수 없다. 같은 클래스를 리턴하고 싶다면 같은 모델을 참조하는 다른 클래스를 만들어야 한다. 예를 들면 이렇다.
class Item(DjangoObjectType):
class Meta:
model = ItemModel
children = graphene.List(_Item) # children = graphene.List(Item)은 안된다.
resolve_children(self, info, **kwargs):
return ...
class _Item(DjangoObjectType):
class Meta:
model = ItemModel
3. graphene.JSONString 타입과 한글
리턴 타입이면 리턴 시 자동으로 json.dumps를 해주고 인자로 받을때는 자동으로 json.loads를 해준다.
인자로 받을 때는 잘 모르겠는데 리턴할 때 한글이 포함되어 있으면 깨진다.
따라서 리턴 타입을 graphene.String으로 하고 수동으로 json.dumps(결과, ensure_ascii=False)를 해주는게 낫다.
깨질만한 내용이 없다면 그냥 쓰면 된다.
4. debug query
전체 schema를 설정하는 파일에
from graphene_django.debug import DjangoDebug
3. graphene.JSONString 타입과 한글
리턴 타입이면 리턴 시 자동으로 json.dumps를 해주고 인자로 받을때는 자동으로 json.loads를 해준다.
인자로 받을 때는 잘 모르겠는데 리턴할 때 한글이 포함되어 있으면 깨진다.
따라서 리턴 타입을 graphene.String으로 하고 수동으로 json.dumps(결과, ensure_ascii=False)를 해주는게 낫다.
깨질만한 내용이 없다면 그냥 쓰면 된다.
4. debug query
전체 schema를 설정하는 파일에
from graphene_django.debug import DjangoDebug
...
class Query(....):
debug = graphene.Field(DjangoDebug, name='__debug')
debug = graphene.Field(DjangoDebug, name='__debug')
를 추가하면 일부 디버그 기능을 쓸 수 있다.
본인은 주로 raw sql을 확인하는데 사용한다.
자세한 내용은 https://github.com/graphql-python/graphene-django/blob/master/graphene_django/debug/sql/types.py 참조
사용법은 이런 식
__debug {
sql {
raw_sql
}
}
5. GraphQLView
url(경로, csrf_exempt(GraphQLView.as_view(graphiql=True)))
이런 식으로 설정하면 해당 경로에서 graphql 테스트 페이지를 볼 수 있다.
graphql=False로 설정하면 url로 쿼리를 날릴 수 있으나 예쁜(?) 테스트 페이지는 안보이므로 불안하다면 이렇게 설정하면 된다.
6. resolve_ 함수
def resolve_some_query(self, info, **kwargs):
resolve_ 함수를 정의할 때 self, info는 반드시 인자에 포함되어야 하고 kwargs는 추가 인자가 있다면 사용한다.
6. resolve_ 함수
def resolve_some_query(self, info, **kwargs):
resolve_ 함수를 정의할 때 self, info는 반드시 인자에 포함되어야 하고 kwargs는 추가 인자가 있다면 사용한다.