Graphene-django: AttributeError: 'NoneType' object has no attribute '_meta'

Created on 9 Jan 2019  路  11Comments  路  Source: graphql-python/graphene-django

I have simple graphene based django project: https://github.com/aliev/graphene-django-bug

For some reason when I'm trying to run server or make migrations I have an exception:

AttributeError: 'NoneType' object has no attribute '_meta'

I'm using model forms and DjangoModelFormMutation

Most helpful comment

I'm having the same issue with the rest framework SerializerMutation

All 11 comments

I'm having the same issue with the rest framework SerializerMutation

same here, can't figure it out why this is happening.

In my case the error originated from defining the SerializerMutation class before the Type class which I needed in the SerializerMutation. After moving all schema types above the mutations it worked.

@ceelian How did you do it? I use separate files for types, queries etc.

Sound similar to my issue: https://github.com/graphql-python/graphene-django/issues/602

@phalt this bug is still current AFAIK. Not sure why this has been closed? To confirm, when putting mutations into a Python file separate from the type definitions I need to import all the types related to the mutations at the top of the file. Even though I don't use them. Otherwise AttributeError: 'NoneType' object has no attribute '_meta' is raised when running unit tests.

  File "/django-project/api/schema.py", line 42, in <module>
    schema = graphene.Schema(query=Query, mutation=Mutation)
  File "/usr/local/lib/python3.6/site-packages/graphene/types/schema.py", line 62, in __init__
    self.build_typemap()
  File "/usr/local/lib/python3.6/site-packages/graphene/types/schema.py", line 126, in build_typemap
    initial_types, auto_camelcase=self.auto_camelcase, schema=self
  File "/usr/local/lib/python3.6/site-packages/graphene/types/typemap.py", line 80, in __init__
    super(TypeMap, self).__init__(types)
  File "/usr/local/lib/python3.6/site-packages/graphql/type/typemap.py", line 28, in __init__
    self.update(reduce(self.reducer, types, OrderedDict()))  # type: ignore
  File "/usr/local/lib/python3.6/site-packages/graphene/types/typemap.py", line 88, in reducer
    return self.graphene_reducer(map, type)
  File "/usr/local/lib/python3.6/site-packages/graphene/types/typemap.py", line 117, in graphene_reducer
    return GraphQLTypeMap.reducer(map, internal_type)
  File "/usr/local/lib/python3.6/site-packages/graphql/type/typemap.py", line 106, in reducer
    field_map = type.fields
  File "/usr/local/lib/python3.6/site-packages/graphql/pyutils/cached_property.py", line 22, in __get__
    value = obj.__dict__[self.func.__name__] = self.func(obj)
  File "/usr/local/lib/python3.6/site-packages/graphql/type/definition.py", line 221, in fields
    return define_field_map(self, self._fields)
  File "/usr/local/lib/python3.6/site-packages/graphql/type/definition.py", line 235, in define_field_map
    field_map = field_map()
  File "/usr/local/lib/python3.6/site-packages/graphene/types/typemap.py", line 274, in construct_fields_for_type
    map = self.reducer(map, field.type)
  File "/usr/local/lib/python3.6/site-packages/graphene/types/typemap.py", line 88, in reducer
    return self.graphene_reducer(map, type)
  File "/usr/local/lib/python3.6/site-packages/graphene/types/typemap.py", line 117, in graphene_reducer
    return GraphQLTypeMap.reducer(map, internal_type)
  File "/usr/local/lib/python3.6/site-packages/graphql/type/typemap.py", line 106, in reducer
    field_map = type.fields
  File "/usr/local/lib/python3.6/site-packages/graphql/pyutils/cached_property.py", line 22, in __get__
    value = obj.__dict__[self.func.__name__] = self.func(obj)
  File "/usr/local/lib/python3.6/site-packages/graphql/type/definition.py", line 221, in fields
    return define_field_map(self, self._fields)
  File "/usr/local/lib/python3.6/site-packages/graphql/type/definition.py", line 235, in define_field_map
    field_map = field_map()
  File "/usr/local/lib/python3.6/site-packages/graphene/types/typemap.py", line 275, in construct_fields_for_type
    field_type = self.get_field_type(map, field.type)
  File "/usr/local/lib/python3.6/site-packages/graphene/types/typemap.py", line 333, in get_field_type
    return GraphQLList(self.get_field_type(map, type.of_type))
  File "/usr/local/lib/python3.6/site-packages/graphene/types/typemap.py", line 336, in get_field_type
    return map.get(type._meta.name)
AttributeError: 'NoneType' object has no attribute '_meta'

I've narrowed it down to that I need to import _only_ those types that have a relation (ForeignKey or OneToOne) to another type. Would you like me to provide a simple example to reproduce the issue, would that help?

Same problem here, it happens when I define types in separate files.

In my particular case I was missing some object type definitions.

By adding a print statement to construct_fields_for_type in class TypeMap:

nano +276 site-packages/graphene/types/typemap.py
    def construct_fields_for_type(self, map, type, is_input_type=False):
        fields = OrderedDict()
        for name, field in type._meta.fields.items():
            print(name) # added print statement here

I was able to determine which foreignkey fields were missing a type definition:

Not completely defined:

class SomethingWithForeignKeyNode(DjangoObjectType):
      class Meta:
           model = SomethingWithForeignKey

Added:

class SomeForeignKeyNode(DjangoObjectType):
    class Meta:
        model = SomeForeignKeyModel
        interfaces = (relay.Node,)
        filter_fields = []

(venv) E:\project\Ecommerce\Unboxxen\backend>python manage.py runserver 127.0.0.1:7000
Watching for file changes with StatReloader
INFO [2020-03-05 17:38:22,724] django.utils.autoreload: Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
March 05, 2020 - 17:38:22
Django version 3.0.3, using settings 'unboxxen.settings.local'
Starting development server at http://127.0.0.1:7000/
Quit the server with CTRL-BREAK.
Internal Server Error: /api/v1/users/
Traceback (most recent call last):
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, callback_args, *callback_kwargs)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(args, *kwargs)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\django\views\generic\base.py", line 71, in view
return self.dispatch(request, args, *kwargs)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\views.py", line 505, in dispatch
response = self.handle_exception(exc)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\views.py", line 465, in handle_exception
self.raise_uncaught_exception(exc)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\views.py", line 476, in raise_uncaught_exception
raise exc
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\views.py", line 502, in dispatch
response = handler(request, args, *kwargs)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\generics.py", line 190, in post
return self.create(request, args, *kwargs)
File "E:\project\Ecommerce\Unboxxen\backendusers\views.py", line 16, in create
serializer.is_valid(raise_exception=True)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\serializers.py", line 234, in is_valid
self._validated_data = self.run_validation(self.initial_data)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\serializers.py", line 433, in run_validation
value = self.to_internal_value(data)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\serializers.py", line 486, in to_internal_value
for field in fields:
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\serializers.py", line 369, in _writable_fields
for field in self.fields.values():
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\django\utils\functional.py", line 48, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\serializers.py", line 363, in fields
for key, value in self.get_fields().items():
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\serializers.py", line 1037, in get_fields
info = model_meta.get_field_info(model)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\utils\model_meta.py", line 39, in get_field_info
forward_relations = _get_forward_relationships(opts)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\utils\model_meta.py", line 96, in _get_forward_relationships
not field.remote_field.through._meta.auto_created
AttributeError: 'NoneType' object has no attribute '_meta'
ERROR [2020-03-05 17:39:38,042] django.request: Internal Server Error: /api/v1/users/
Traceback (most recent call last):
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, callback_args, *callback_kwargs)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(args, *kwargs)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\django\views\generic\base.py", line 71, in view
return self.dispatch(request, args, *kwargs)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\views.py", line 505, in dispatch
response = self.handle_exception(exc)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\views.py", line 465, in handle_exception
self.raise_uncaught_exception(exc)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\views.py", line 476, in raise_uncaught_exception
raise exc
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\views.py", line 502, in dispatch
response = handler(request, args, *kwargs)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\generics.py", line 190, in post
return self.create(request, args, *kwargs)
File "E:\project\Ecommerce\Unboxxen\backendusers\views.py", line 16, in create
serializer.is_valid(raise_exception=True)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\serializers.py", line 234, in is_valid
self._validated_data = self.run_validation(self.initial_data)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\serializers.py", line 433, in run_validation
value = self.to_internal_value(data)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\serializers.py", line 486, in to_internal_value
for field in fields:
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\serializers.py", line 369, in _writable_fields
for field in self.fields.values():
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\django\utils\functional.py", line 48, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\serializers.py", line 363, in fields
for key, value in self.get_fields().items():
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\serializers.py", line 1037, in get_fields
info = model_meta.get_field_info(model)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\utils\model_meta.py", line 39, in get_field_info
forward_relations = _get_forward_relationships(opts)
File "E:\project\Ecommerce\Unboxxen\venv\lib\site-packages\rest_framework\utils\model_meta.py", line 96, in _get_forward_relationships
not field.remote_field.through._meta.auto_created
AttributeError: 'NoneType' object has no attribute '_meta'
[05/Mar/2020 17:39:38] "POST /api/v1/users/ HTTP/1.1" 500 24231

Help me

I've got the same error after splitting code base for queries, mutations and serializers. I was writing all into one module schema.py and it was under boilerplate code avalanche just for 5 models -> 5 query classes + 5 mutation classes and 5 serializer classes into mutation meta classes. I reset previous commits and it works just fine. I did this because returning this boilerplate code back manually caused the same error with _meta.
```

schema.py

import graphene
from graphene import relay
from graphene_django import DjangoObjectType, DjangoConnectionField
from graphene_django.rest_framework.mutation import SerializerMutation
from rest_framework.serializers import ModelSerializer
from .models import *

class CategoryNode(DjangoObjectType):
class Meta:
model = Category
interfaces = (relay.Node,)

class CategoryMutation(SerializerMutation):
class Meta:
class CategorySerializer(ModelSerializer):
class Meta:
model = Category
fields = '__all__'

    serializer_class = CategorySerializer

...

class Query:
categories = DjangoConnectionField(CategoryNode)
editions = DjangoConnectionField(EditionNode)
resources = DjangoConnectionField(ResourceNode)
reviews = DjangoConnectionField(ReviewNode)

category = graphene.relay.Node.Field(CategoryNode)
edition = graphene.relay.Node.Field(EditionNode)
resource = graphene.relay.Node.Field(ResourceNode)
review = graphene.relay.Node.Field(ReviewNode)

class Mutation:
category = CategoryMutation.Field()
edition = EditionMutation.Field()
resource = ReviewMutation.Field()
review = ReviewMutation.Field()

```
Idk but this seems legit for graphene_django

Mmm no, I've mistaken. code split is legit. It's because SerializerMutation doesn't support nested serializers, like this:

class EmployeeMutation(SerializerMutation):
    class Meta:
        class EmployeeSerializer(ModelSerializer):
            member = OrganizationMemberSerializer(required=True)

            class Meta:
                model = Employee
                fields = '__all__'

        serializer_class = EmployeeSerializer

commenting out line with member = OrganizationMemberSerializer(required=True) and other nested writable serializers does not raise AttributeError: 'NoneType' object has no attribute '_meta'.

DRF's ModelSerializer allows writable nested serializers I want same in graphene_django

EDIT

Add node (or type whatever you called it) for nested serializer

class OrganizationMemberNode(DjangoObjectType):
    class Meta:
        model = OrganizationMember
        interfaces = (relay.Node,)


class EmployeeMutation(SerializerMutation):
    class Meta:
        class EmployeeSerializer(ModelSerializer):
            member = OrganizationMemberSerializer(required=True)

            class Meta:
                model = Employee
                fields = '__all__'

        serializer_class = EmployeeSerializer
Was this page helpful?
0 / 5 - 0 ratings

Related issues

Eraldo picture Eraldo  路  3Comments

hyusetiawan picture hyusetiawan  路  4Comments

amiyatulu picture amiyatulu  路  3Comments

BrianChapman picture BrianChapman  路  3Comments

ZuluPro picture ZuluPro  路  3Comments