【问题标题】:Unresolved attribute reference 'objects' for class '' in PyCharmPyCharm 中类“”的未解析属性引用“对象”
【发布时间】:2017-10-07 12:55:52
【问题描述】:

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

【问题讨论】:

    标签: python django pycharm


    【解决方案1】:

    您需要启用 Django 支持。去

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

    然后检查Enable Django Support

    【讨论】:

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

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

    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 感谢举报,现已修复。
    【解决方案3】:

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

    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 抽象化。更新我的答案
    【解决方案4】:

    Python 框架(Django、Flask 等)仅在专业版中受支持。 查看下面的链接了解更多详情。

    PyCharm Editions Comparison

    【讨论】:

      【解决方案5】:

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

      models.py

      from django.db import models
      
      
      class Model(models.Model):
          class Meta:
              abstract = True
      
      class SomeModel(Model):
          pass
      

      models.pyi

      from django.db import models
      
      class Model:
          objects: models.Manager()
      

      这应该启用 PyCharm 的代码完成:

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

      【讨论】:

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

      我发现的另一个解决方案是将@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
      

      【讨论】:

        猜你喜欢
        • 2015-02-03
        • 1970-01-01
        • 2019-08-19
        • 1970-01-01
        • 2018-06-08
        • 2021-05-16
        • 2021-04-06
        • 2021-08-27
        • 2021-08-13
        相关资源
        最近更新 更多