101 votes

Référence d'attribut non résolue 'objects' pour la classe '' dans PyCharm

J'utilise le pycharm communautaire et la version de python est 3.6.1, django est 1.11.1. Cet avertissement n'a aucune incidence sur l'exécution, mais je ne peux pas utiliser la fonction de complétion automatique de l'IDE.

185voto

vishes_shell Points 10206

Vous devez activer le support de Django. Allez sur

PyCharm -> Préférences -> Langues et cadres -> Django

et ensuite vérifier Enable Django Support

68 votes

Django n'est actuellement pris en charge que par la version payante de pycharm.

2 votes

@EricBlum yep, je sais, mais PyCharm est génial. Et il existe un moyen de désactiver ces inspections. Il existe également un moyen d'utiliser différents IDE, comme Atom, Visual Code et d'autres.

4 votes

@vishes_shell si je désactive cette inspection, l'auto complete sera également désactivé. y a-t-il d'autres moyens de résoudre ce problème ?

49voto

Campi Points 170

Vous pouvez également exposer le gestionnaire de modèle par défaut de manière explicite :

from django.db import models

class Foo(models.Model):
    name = models.CharField(max_length=50, primary_key=True)

    objects = models.Manager()

0 votes

Je fais cela parce que j'ai une models.Manager() et il a l'avantage supplémentaire de ne pas casser PyCharm CE. Exposer le gestionnaire de modèle par défaut n'est pas pythique ?

0 votes

Vous pouvez ajouter plusieurs gestionnaires à votre modèle. Lorsque vous accédez à Foo.objects, vous accédez au gestionnaire standard, il n'est donc pas incorrect de l'exposer. Je ne sais pas si c'est contraire à l'esprit pythique.

0 votes

Je pense que la syntaxe correcte serait from django.db import models maintenant.

3voto

winux Points 125

Les frameworks Python (Django, Flask, etc.) ne sont supportés que dans l'édition professionnelle. Consultez le lien ci-dessous pour plus de détails.

Comparaison des éditions de PyCharm

2voto

J'ai trouvé cette solution de contournement en utilisant des fichiers de stub :

models.py

from django.db import models

class Model(models.Model):
    class Meta:
        abstract = True

class SomeModel(Model):
    pass

modèles.pyi

from django.db import models

class Model:
    objects: models.Manager()

Cela devrait activer la complétion de code de PyCharm : enter image description here

Cette solution est similaire à celle de Campi, mais évite de devoir redéfinir la valeur par défaut.

0 votes

C'est une bonne solution, mais c'est mieux si elle se trouve dans un fichier séparé. Comme ceci, PyCharm veut que chaque classe soit spécifiée dans le stub, sinon vous obtiendrez l'erreur "Cannot find reference 'SomeModel' in 'models.pyi'" lorsque vous importerez SomeModel dans un autre fichier.

0voto

Yarh Points 95

Une autre solution que j'ai trouvée est de mettre le décorateur @python_2_unicode_compatible sur tous les modèles. Cela nécessite également d'avoir un str mise en œuvre de votre fonction

Par exemple :

# models.py

from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible
class SomeModel(models.Model):
    name = Models.CharField(max_length=255)

    def __str__(self):
         return self.name

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X