5
5
import traceback
6
6
from typing import List , Optional
7
7
8
- import django .core .serializers
9
8
import strawberry
10
9
from asgiref .sync import sync_to_async
10
+ from django .core .serializers import deserialize , serialize
11
11
from django .db .models import Q
12
+ from strawberry_django import ModelResolver , types
12
13
13
14
from api import models
14
15
15
16
16
- # input HeroInput {
17
+ class HeroResolver (ModelResolver ):
18
+ model = models .Hero
19
+
20
+
21
+ # type Hero {
17
22
# id: String
18
23
# name: String
19
24
# color: String!
20
25
# updatedAt: Float
21
26
# deleted: Boolean!
22
27
# }
23
- @strawberry .input
24
- class HeroInput :
25
- id : str
26
- color : str
27
- name : Optional [str ] = ""
28
- updatedAt : Optional [float ] = 0
29
- deleted : Optional [bool ] = False
28
+ class Hero (HeroResolver .output_type ):
29
+ pass
30
30
31
31
32
- # type Hero {
32
+ # input HeroInput {
33
33
# id: String
34
34
# name: String
35
35
# color: String!
36
36
# updatedAt: Float
37
37
# deleted: Boolean!
38
38
# }
39
- @strawberry .type
40
- class Hero :
41
- id : str
42
- color : str
43
- name : Optional [str ] = ""
44
- updatedAt : Optional [float ] = 0
45
- deleted : Optional [bool ] = False
39
+ # The client code expects the input type to be called "HeroInput", not "CreateHero", which is the default
40
+ # We therefore need to create a new type via the strawberry.input decorator
41
+ # class HeroInput(HeroResolver.create_input_type):
42
+ @strawberry .input
43
+ class HeroInput (HeroResolver .create_input_type ):
44
+ pass
46
45
47
46
48
47
def filterHeroes (
@@ -68,9 +67,11 @@ def filterHeroes(
68
67
69
68
@strawberry .type
70
69
class Query :
71
- @strawberry .field
72
- def hello () -> str :
73
- return "world"
70
+ ## to include the auto-generated methods from strawberry-graphql-django:
71
+ ## - hero(id: ID!): Hero!
72
+ ## - heros(filters: [String!] = null): [Hero!]!
73
+ ## declare the class as
74
+ ## class Query(HeroResolver.query()):
74
75
75
76
# type Query {
76
77
# feedHero(id: String, updatedAt: Float, limit: Int!): [Hero!]!
@@ -89,15 +90,6 @@ class Mutation:
89
90
# }
90
91
@strawberry .mutation
91
92
async def set_hero (self , info , hero : HeroInput = None ) -> Hero :
92
- print (f"Creating Hero from HeroInput { hero } " )
93
-
94
- shero = Hero (
95
- id = hero .id ,
96
- color = hero .color ,
97
- name = hero .name ,
98
- updatedAt = hero .updatedAt ,
99
- deleted = hero .deleted ,
100
- )
101
93
try :
102
94
dhero = await sync_to_async (models .Hero .objects .get )(id = hero .id )
103
95
except models .Hero .DoesNotExist :
@@ -106,15 +98,20 @@ async def set_hero(self, info, hero: HeroInput = None) -> Hero:
106
98
dhero .color = hero .color
107
99
dhero .name = hero .name
108
100
dhero .updatedAt = int (time .time ())
109
-
110
101
dhero .deleted = hero .deleted
111
- await sync_to_async (dhero .save )()
112
102
103
+ await sync_to_async (dhero .save )()
113
104
await info .context .broadcast .publish (
114
- channel = "heros" , message = django . core . serializers . serialize ("json" , [dhero ])
105
+ channel = "heros" , message = serialize ("json" , [dhero ])
115
106
)
116
107
117
- return shero
108
+ return Hero (
109
+ id = dhero .id ,
110
+ color = dhero .color ,
111
+ name = dhero .name ,
112
+ updatedAt = dhero .updatedAt ,
113
+ deleted = dhero .deleted ,
114
+ )
118
115
119
116
120
117
@strawberry .type
@@ -126,9 +123,7 @@ class Subscription:
126
123
async def changed_hero (self , info , token : str ) -> Hero :
127
124
async with info .context .broadcast .subscribe (channel = "heros" ) as subscriber :
128
125
async for event in subscriber :
129
- hero = list (django .core .serializers .deserialize ("json" , event .message ))[
130
- 0
131
- ].object
126
+ hero = list (deserialize ("json" , event .message ))[0 ].object
132
127
yield Hero (
133
128
id = hero .id ,
134
129
color = hero .color ,
0 commit comments