@@ -33,24 +33,6 @@ def construct_fields(
33
33
):
34
34
_model_fields = get_model_fields (model )
35
35
36
- # Validate the given fields against the model's fields.
37
- model_field_names = set (field [0 ] for field in _model_fields )
38
- for fields_list in (only_fields , exclude_fields ):
39
- if not fields_list :
40
- continue
41
- for name in fields_list :
42
- if name in model_field_names :
43
- continue
44
-
45
- if hasattr (model , name ):
46
- raise Exception (
47
- '"{}" exists on model {} but it\' s not a field.' .format (name , model )
48
- )
49
- else :
50
- raise Exception (
51
- 'Field "{}" doesn\' t exist on model {}.' .format (name , model )
52
- )
53
-
54
36
fields = OrderedDict ()
55
37
for name , field in _model_fields :
56
38
is_not_in_only = only_fields and name not in only_fields
@@ -80,6 +62,44 @@ def construct_fields(
80
62
return fields
81
63
82
64
65
+ def validate_fields (type_ , model , fields , only_fields , exclude_fields ):
66
+ # Validate the given fields against the model's fields and custom fields
67
+ all_field_names = set (fields .keys ())
68
+ for fields_list in (only_fields , exclude_fields ):
69
+ if not fields_list :
70
+ continue
71
+ for name in fields_list :
72
+ if name in all_field_names :
73
+ continue
74
+
75
+ if hasattr (model , name ):
76
+ warnings .warn (
77
+ (
78
+ 'Field name "{field_name}" matches an attribute on Django model "{app_label}.{object_name}" '
79
+ "but it's not a model field so Graphene cannot determine what type it should be. "
80
+ 'Either define the type of the field on DjangoObjectType "{type_}" or remove it from the "fields" list.'
81
+ ).format (
82
+ field_name = name ,
83
+ app_label = model ._meta .app_label ,
84
+ object_name = model ._meta .object_name ,
85
+ type_ = type_ ,
86
+ )
87
+ )
88
+
89
+ else :
90
+ warnings .warn (
91
+ (
92
+ 'Field name "{field_name}" doesn\' t exist on Django model "{app_label}.{object_name}". '
93
+ 'Consider removing the field from the "fields" list of DjangoObjectType "{type_}" because it has no effect.'
94
+ ).format (
95
+ field_name = name ,
96
+ app_label = model ._meta .app_label ,
97
+ object_name = model ._meta .object_name ,
98
+ type_ = type_ ,
99
+ )
100
+ )
101
+
102
+
83
103
class DjangoObjectTypeOptions (ObjectTypeOptions ):
84
104
model = None # type: Model
85
105
registry = None # type: Registry
@@ -211,6 +231,9 @@ def __init_subclass_with_meta__(
211
231
_meta = _meta , interfaces = interfaces , ** options
212
232
)
213
233
234
+ # Validate fields
235
+ validate_fields (cls , model , _meta .fields , fields , exclude )
236
+
214
237
if not skip_registry :
215
238
registry .register (cls )
216
239
0 commit comments