AttributeError:'NoneType'对象没有属性'attname'(Django)

时间:2017-09-22 08:44:36

标签: django django-models

我有一个相当复杂的模型,第一次调用MyModel.objects.create(**kwargs)失败并带有

  

AttributeError:'NoneType'对象没有属性'attname'

堆栈跟踪像这样(在Django 1.11中)潜水下来

django/db/models/manager.py:85: in manager_method
   return getattr(self.get_queryset(), name)(*args, **kwargs)
django/db/models/query.py:394: in create
   obj.save(force_insert=True, using=self.db)
django/db/models/base.py:807: in save
   force_update=force_update, update_fields=update_fields)
django/db/models/base.py:837: in save_base
   updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
django/db/models/base.py:889: in _save_table
   pk_val = self._get_pk_val(meta)
django/db/models/base.py:644: in _get_pk_val
   return getattr(self, meta.pk.attname)
django/db/models/query_utils.py:114: in __get__
   val = self._check_parent_chain(instance, self.field_name)
django/db/models/query_utils.py:131: in __check_parent_chain
   return getattr(instance, link_field.attname)

模型定义对我来说没问题。我检查了create来电的所有参数正是我想要的。

我并不热衷于剥离模型以找到问题,因为模型非常复杂。 (我的所有其他模型,其中许多类似,似乎工作正常。)

那么什么可能导致这个奇怪的消息?

4 个答案:

答案 0 :(得分:8)

花了大约90分钟才找到这个。 我只是在我从模型中首先取出抽象超模,然后是所有关系字段,然后是一个只有一个数据字段,直到只剩下一个IntegerField之后才找到它。 create仍无效。

此时,我在完全相同的测试环境中对其他一些简单的模型类create调用了MyModel2。它起作用(就像惯用的微风)。

那么MyModel ??

到底有什么特别之处

然后我突然意识到:MyModel有一个__init__方法;我的大多数其他型号都没有。所以看看那个。并且敲打你的额头:我只是忘记了强制性(以Python 3风格)

super().__init__(*args, **kwargs)

道德:不要忘记这一点,否则你可能会遇到非常棘手的错误信息。

(注意:如果你不喜欢这篇文章的风格,我很抱歉。这需要我的治疗写作。)

答案 1 :(得分:0)

重新构造前一个并使其更明确: 此错误是由于 init 方法未引用其父类引起的。 确保您的 init 方法的定义如下:

def __init__(self, *args, **kwargs):
    super().__init__(*args,**kwargs)

答案 2 :(得分:0)

我遇到了这个错误,但来自一个完全不同的用例。我最终通过从其 id 表示中删除 __dict__ 属性来破坏我的 Django 模型实例对象,然后尝试再次访问 id 属性,如下所示。解决方案:如果您打算稍后在原始实例对象上使用这些属性,请不要从 Django 模型实例的 __dict__ 中删除项目。

instance1 = File.objects.get(path = '/path/to/sample1.txt')

print(instance1)
# /path/to/sample1.txt # this is my normal __str__ method for the model

# preview the instance dict representation
print(instance1.__dict__)
# {'_state': <django.db.models.base.ModelState object>, 'id': 7, 'path': '/path/to/sample1.txt'}

# create object to hold the dict
instance1_dict = instance1.__dict__

# remove 'id' for test case because its non-deterministic
instance1_dict.pop('id')

# check what the dict object looks like now
print(instance1_dict)
# {'_state': <django.db.models.base.ModelState object>, 'path': '/path/to/sample1.txt'}
# 'id' no longer present

# check what the original instance object dict representation looks like
print(instance1.__dict__)
# {'_state': <django.db.models.base.ModelState object>, 'path': '/path/to/sample1.txt'}
# 'id' is no longer present anymore

# try to access 'id' on the original instance object
expected_id = instance1.id
# AttributeError: 'NoneType' object has no attribute 'attname'

答案 3 :(得分:0)

至于我,我有:

 def __init__(self):
        return self.title

代替

 def __str__(self):
        return self.title

所以我错误地输入了 __init__ 代替了 __str__