2017-09-22 2 views
2

j'ai un modèle relativement complexe pour lequel le premier appel à MyModel.objects.create(**kwargs) échoue avecAttributeError: objet « NoneType » n'a pas d'attribut « attname » (Django)

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

La trace de pile plonge vers le bas comme cela (en 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) 

La définition du modèle me semble correcte. J'ai vérifié tous les paramètres de l'appel create sont exactement ce que je veux qu'ils soient. Je ne veux pas démonter le modèle pour trouver le problème, parce que le modèle est si complexe. (Tous mes autres modèles, beaucoup d'entre eux similaires, semblent fonctionner correctement.)

Alors, qu'est-ce qui pourrait causer ce message étrange?

Répondre

2

Il a fallu environ 90 minutes pour trouver ceci. Je ne l'ai trouvé qu'après avoir sorti de mon modèle d'abord le top model abstrait, puis tous les champs de relations, puis tous les champs de données sauf un, jusqu'à ce qu'il ne reste plus qu'un seul IntegerField. Le create ne fonctionnait toujours pas.

À ce stade, j'ai appelé create sur une autre classe de modèle simple MyModel2 exactement dans le même contexte de test. Cela a fonctionné (comme la brise idiomatique).

Alors, qu'est-ce qui était spécial à propos de MyModel ?? Puis j'ai compris: MyModel avait une méthode __init__; la plupart de mes autres modèles ne l'ont pas fait. Alors regarde ça. Et frapper sur le front: J'avais simplement oublié le obligatoire (dans le style Python 3)

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

Moral: Ne pas oublier ceci ou vous pouvez souffrir d'un message d'erreur vraiment difficile.

(Note:.. Si vous ne l'aimez pas le style de ce poste, je suis désolé, il était nécessaire écrit thérapeutique pour moi)