ChatGPT解决这个技术问题 Extra ChatGPT

PyCharm 中类“”的未解析属性引用“对象”

我使用社区pycharm,python的版本是3.6.1,django是1.11.1。此警告对运行没有影响,但我无法使用 IDE 的自动完成功能。


z
zx485

您需要启用 Django 支持。去

PyCharm -> 首选项 -> 语言和框架 -> Django

然后检查 Enable Django Support


Django 目前仅在 pycharm 的付费版本中受支持
@EricBlum 是的,我知道,但是 PyCharm 很棒。并且有一种方法可以禁用此类检查。还有一种方法可以使用不同的 IDE,例如 Atom、Visual Code 等。
@vishes_shell 如果我只是禁用此检查,自动完成也将被禁用。有没有其他方法可以解决这个问题?
@vishes_shell 问题是关于社区版的。我相信正确的答案是做不到。
在 PyCharm 4.5 版中,社区版本支持 Django/objects。
C
Campi

您还可以显式公开默认模型管理器:

from django.db import models

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

    objects = models.Manager()

我这样做是因为我有一个自定义 models.Manager(),并且它具有不破坏 PyCharm CE 的额外好处。是否公开默认模型管理器 un-pythonic?
您可以将多个经理添加到您的模型中。当您访问 Foo.objects 时,您确实访问了标准管理器,因此公开它并没有错。它是否是非pythonic,我不确定。
我认为现在正确的语法是 from django.db import models
@FarzadSoltani 感谢您的举报,现在已修复。
J
Joseph Bani

为所有暴露对象的模型使用基本模型:

class BaseModel(models.Model):
    objects = models.Manager()
    class Meta:
        abstract = True


class Model1(BaseModel):
    id = models.AutoField(primary_key=True)

class Model2(BaseModel):
    id = models.AutoField(primary_key=True)

这会影响迁移添加另一个模型吗?
不,因为类基本相同,但最好将 BaseModel 抽象化。更新我的答案
w
winux

Python 框架(Django、Flask 等)仅在专业版中受支持。检查下面的链接以获取更多详细信息。

PyCharm Editions Comparison


E
Eric Aya

我使用存根文件发现了这个 hacky 解决方法:

模型.py

from django.db import models


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

class SomeModel(Model):
    pass

模型.pyi

from django.db import models

class Model:
    objects: models.Manager()

https://i.stack.imgur.com/8YoXZ.png

这类似于 Campi 的解决方案,但避免了重新声明默认值的需要


很好的解决方法,但如果它位于单独的文件中会更好。像这样,PyCharm 需要在存根中指定每个类,否则在另一个文件中导入 SomeModel 时会出现错误“在 'models.pyi' 中找不到引用 'SomeModel'”。
Y
Yarh

我发现的另一个解决方案是将 @python_2_unicode_compatible 装饰器放在任何模型上。它还要求你有一个 str 实现四个你的函数

例如:

# 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