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

Lut*_*elt 8 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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Lut*_*elt 14

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

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

那么到底有什么特别之处MyModel

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

super().__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

至于我,我有:

 def __init__(self):
        return self.title
Run Code Online (Sandbox Code Playgroud)

代替

 def __str__(self):
        return self.title
Run Code Online (Sandbox Code Playgroud)

所以我输错__init____str__

  • 嗨,贾菲斯,很高兴你来了。然而,这并不是问题的答案。如果有人投反对票,请不要感到惊讶或冒犯。(它适合作为评论,但添加评论需要比您当前拥有的更多点 - 在 StackOverflow 上起步很艰难。) (3认同)