3
3
from django .test import TestCase
4
4
from django .test .utils import CaptureQueriesContext
5
5
import graphene
6
- import pytest
7
6
8
- from .. import registry
9
- from ..fields import DjangoConnectionField
7
+ from ..fields import DjangoConnectionField , DjangoListField
10
8
from ..optimization import optimize_queryset
11
9
from ..types import DjangoObjectType
12
10
from .models import (
13
11
Article as ArticleModel ,
14
- Reporter as ReporterModel ,
15
- Pet as PetModel
12
+ Reporter as ReporterModel
16
13
)
17
14
18
- pytestmark = pytest .mark .django_db
19
-
20
- registry .reset_global_registry ()
21
-
22
15
23
16
class Article (DjangoObjectType ):
24
17
class Meta :
@@ -27,24 +20,36 @@ class Meta:
27
20
28
21
29
22
class Reporter (DjangoObjectType ):
23
+ favorite_pet = graphene .Field (lambda : Reporter )
24
+
30
25
class Meta :
31
26
model = ReporterModel
27
+ #interfaces = (graphene.relay.Node,)
28
+ optimizations = {
29
+ 'favorite_pet' : {
30
+ 'prefetch' : ['pets' ]
31
+ }
32
+ }
32
33
33
-
34
- class Pet ( DjangoObjectType ):
35
- class Meta :
36
- model = PetModel
34
+ def resolve_favorite_pet ( self , * args ):
35
+ for pet in self . pets . all ( ):
36
+ if pet . last_name == 'Kent' :
37
+ return pet
37
38
38
39
39
40
class RootQuery (graphene .ObjectType ):
40
41
article = graphene .Field (Article , id = graphene .ID ())
41
42
articles = DjangoConnectionField (Article )
43
+ reporters = DjangoListField (Reporter )
42
44
43
45
def resolve_article (self , args , context , info ):
44
46
qs = ArticleModel .objects
45
47
qs = optimize_queryset (ArticleModel , qs , info .field_asts [0 ])
46
48
return qs .get (** args )
47
49
50
+ def resolve_reporters (self , args , context , info ):
51
+ return ReporterModel .objects
52
+
48
53
49
54
schema = graphene .Schema (query = RootQuery )
50
55
@@ -124,3 +129,25 @@ def test_prefetch_related(self):
124
129
assert len (returned_articles ) == 2
125
130
126
131
self .assertEqual (len (query_context .captured_queries ), 4 )
132
+
133
+ def test_manual (self ):
134
+ query = """query {
135
+ reporters {
136
+ email
137
+ favoritePet {
138
+ email
139
+ }
140
+ }
141
+ }"""
142
+
143
+ with CaptureQueriesContext (connection ) as query_context :
144
+ results = schema .execute (query )
145
+
146
+ returned_reporters = results .data ['reporters' ]
147
+ assert len (returned_reporters ) == 2
148
+
149
+ returned_editor = [reporter for reporter in returned_reporters
150
+ if reporter ['email' ] == self .editor .email ][0 ]
151
+ assert returned_editor ['favoritePet' ]['email' ] == self .reporter .email
152
+
153
+ self .assertEqual (len (query_context .captured_queries ), 2 )
0 commit comments