我有一个相当复杂的模型,第一次调用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
来电的所有参数正是我想要的。
我并不热衷于剥离模型以找到问题,因为模型非常复杂。 (我的所有其他模型,其中许多类似,似乎工作正常。)
那么什么可能导致这个奇怪的消息?
答案 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__