|
1 | 1 | from graphene import relay |
2 | 2 | from graphene.contrib.django.utils import get_type_for_model, lazy_map |
3 | | -from graphene.core.fields import Field, LazyField, ListField |
| 3 | +from graphene.core.exceptions import SkipField |
| 4 | +from graphene.core.fields import Field |
| 5 | +from graphene.core.types.base import FieldType |
| 6 | +from graphene.core.types.definitions import List |
4 | 7 | from graphene.relay.utils import is_node |
5 | 8 |
|
6 | 9 |
|
7 | 10 | class DjangoConnectionField(relay.ConnectionField): |
8 | 11 |
|
9 | 12 | def wrap_resolved(self, value, instance, args, info): |
10 | 13 | schema = info.schema.graphene_schema |
11 | | - return lazy_map(value, self.get_object_type(schema)) |
| 14 | + return lazy_map(value, self.type.get_object_type(schema)) |
12 | 15 |
|
13 | 16 |
|
14 | | -class LazyListField(ListField): |
| 17 | +class LazyListField(Field): |
15 | 18 |
|
16 | | - def resolve(self, instance, args, info): |
| 19 | + def get_type(self, schema): |
| 20 | + return List(self.type) |
| 21 | + |
| 22 | + def resolver(self, instance, args, info): |
17 | 23 | schema = info.schema.graphene_schema |
18 | | - resolved = super(LazyListField, self).resolve(instance, args, info) |
| 24 | + resolved = super(LazyListField, self).resolver(instance, args, info) |
19 | 25 | return lazy_map(resolved, self.get_object_type(schema)) |
20 | 26 |
|
21 | 27 |
|
22 | | -class ConnectionOrListField(LazyField): |
| 28 | +class ConnectionOrListField(Field): |
23 | 29 |
|
24 | | - def get_field(self, schema): |
25 | | - model_field = self.field_type |
| 30 | + def internal_type(self, schema): |
| 31 | + model_field = self.type |
26 | 32 | field_object_type = model_field.get_object_type(schema) |
27 | 33 | if is_node(field_object_type): |
28 | 34 | field = DjangoConnectionField(model_field) |
29 | 35 | else: |
30 | 36 | field = LazyListField(model_field) |
31 | 37 | field.contribute_to_class(self.object_type, self.name) |
32 | | - return field |
| 38 | + return field.internal_type(schema) |
33 | 39 |
|
34 | 40 |
|
35 | | -class DjangoModelField(Field): |
| 41 | +class DjangoModelField(FieldType): |
36 | 42 |
|
37 | 43 | def __init__(self, model, *args, **kwargs): |
38 | | - super(DjangoModelField, self).__init__(None, *args, **kwargs) |
39 | 44 | self.model = model |
40 | | - |
41 | | - def resolve(self, instance, args, info): |
42 | | - resolved = super(DjangoModelField, self).resolve(instance, args, info) |
43 | | - schema = info.schema.graphene_schema |
44 | | - _type = self.get_object_type(schema) |
45 | | - assert _type, ("Field %s cannot be retrieved as the " |
46 | | - "ObjectType is not registered by the schema" % ( |
47 | | - self.attname |
48 | | - )) |
49 | | - return _type(resolved) |
| 45 | + super(DjangoModelField, self).__init__(*args, **kwargs) |
50 | 46 |
|
51 | 47 | def internal_type(self, schema): |
52 | 48 | _type = self.get_object_type(schema) |
53 | | - if not _type and self.object_type._meta.only_fields: |
| 49 | + if not _type and self.parent._meta.only_fields: |
54 | 50 | raise Exception( |
55 | 51 | "Model %r is not accessible by the schema. " |
56 | 52 | "You can either register the type manually " |
57 | 53 | "using @schema.register. " |
58 | | - "Or disable the field %s in %s" % ( |
| 54 | + "Or disable the field in %s" % ( |
59 | 55 | self.model, |
60 | | - self.attname, |
61 | | - self.object_type |
| 56 | + self.parent, |
62 | 57 | ) |
63 | 58 | ) |
64 | | - return schema.T(_type) or Field.SKIP |
| 59 | + if not _type: |
| 60 | + raise SkipField() |
| 61 | + return schema.T(_type) |
65 | 62 |
|
66 | 63 | def get_object_type(self, schema): |
67 | 64 | return get_type_for_model(schema, self.model) |
0 commit comments