django模块'appname'没有属性'models' [英] django module 'appname' has no attribute 'models'

查看:62
本文介绍了django模块'appname'没有属性'models'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

直到我删除venv并使用pycharm重新创建venv之前,一切都运转良好.现在,无论我用django运行什么命令,它都会引发此错误:

Everything was working fine until today after I deleted venv and re-created it with pycharm. Now, whatever command I run with django, It throws up this error:

AttributeError: module 'api_backend' has no attribute 'models'

完整追溯:

(venv) C:\Users\iyapp\OneDrive\Desktop\python projects\DataSheet-ledger>python manage.py startapp test
Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
  File "manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\iyapp\OneDrive\Desktop\python projects\DataSheet-ledger\venv\lib\site-packages\django\core\management\__init__.py", line 401, in execute_f
rom_command_line
    utility.execute()
  File "C:\Users\iyapp\OneDrive\Desktop\python projects\DataSheet-ledger\venv\lib\site-packages\django\core\management\__init__.py", line 377, in execute
    django.setup()
  File "C:\Users\iyapp\OneDrive\Desktop\python projects\DataSheet-ledger\venv\lib\site-packages\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\Users\iyapp\OneDrive\Desktop\python projects\DataSheet-ledger\venv\lib\site-packages\django\apps\registry.py", line 114, in populate
    app_config.import_models()
  File "C:\Users\iyapp\OneDrive\Desktop\python projects\DataSheet-ledger\venv\lib\site-packages\django\apps\config.py", line 211, in import_models
    self.models_module = import_module(models_module_name)
  File "C:\Users\iyapp\AppData\Local\Programs\Python\Python36-32\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\Users\iyapp\OneDrive\Desktop\python projects\DataSheet-ledger\api_backend\models\__init__.py", line 2, in <module>
    from .data_sheets import *
  File "C:\Users\iyapp\OneDrive\Desktop\python projects\DataSheet-ledger\api_backend\models\data_sheets.py", line 2, in <module>
    from api_backend.managers.positions import PositionalManager
  File "C:\Users\iyapp\OneDrive\Desktop\python projects\DataSheet-ledger\api_backend\managers\__init__.py", line 1, in <module>
    from .field_data import FieldDataManager
  File "C:\Users\iyapp\OneDrive\Desktop\python projects\DataSheet-ledger\api_backend\managers\field_data.py", line 3, in <module>
    import api_backend.models as api_models
AttributeError: module 'api_backend' has no attribute 'models'

这就是我所做的-我删除了venv,再次创建并运行

This is what I did- I deleted the venv, created it again and ran

python -r requirements.txt

但是,我什么也不能做-不进行迁移或运行服务器.为什么会这样呢?是因为循环依赖项错误吗?

But then, I cannot do anything else- no migrations or running the server. Why is this so? Is it because of a circular dependency error?

project structure

以下是回溯中提到的文件:模型/初始 .py

Here are the files mentioned in traceback: models/init.py

from .data_sheets import *
from .roles import *

models/datasheets.py

from django.db import models
from api_backend.managers.positions import PositionalManager
from django.core.validators import MinLengthValidator


class DataSheetsCluster(models.Model):

    objects = models.Manager()
    id = models.BigAutoField(primary_key=True, db_index=True, editable=False, auto_created=True)
    name = models.CharField(max_length=100, validators=[MinLengthValidator(2)], db_index=True)
    created_at = models.DateTimeField(auto_now=True, editable=False, db_index=True)

    REQUIRED_FIELDS = [name]


class DataSheetPositionManager(PositionalManager):

    def __init__(self):
        super().__init__()
        self.POSITIONAL_MODEL = DataSheet

    @classmethod
    def get_overwrite_objects(cls, parent_object: DataSheetsCluster):
        return parent_object.datasheets

经理/初始化 .py

managers/init.py

from .field_data import FieldDataManager
from .data_sheets import DataSheetsManager
from .roles import RolesManager
from .positions import PositionalManager

managers/field_data.py

from django.db import models, transaction
import api_backend.models as api_models


class FieldDataManager(models.Manager):
    """
    A manager class to deal with Cluster Size Limits,
    Field DataType Validation and JSON.dumping raw data.
    """

    def __init__(self):
        super().__init__()

    ...

    def create_field_data(self, field, data: list, owner):
        """
        Creates multiple record data objects with the given
        Serializer data.
        """
        transaction.set_autocommit(False)
        try:
            record_data = [self.create_field_data_object(owner=owner, parent=field, **record) for record in data]
            created_records = api_models.FieldData.objects.bulk_create(record_data)
            field.data.add(*created_records)
        except Exception as err:
            transaction.rollback()
            raise ValueError(err)
        else:
            transaction.commit()
        finally:
            transaction.set_autocommit(True)
        return created_records

有人可以帮助我解决此错误吗?例如,如果需要,我需要更换哪些型号?感谢您的宝贵时间!

can someone please help me fix this error? like what models do I need to shift if needed? thanks for spending your time!

推荐答案

这里的问题是循环依赖项错误.我通过重组项目解决了这个问题.所以现在,经理是我的models文件夹中的子文件夹.我的模型可以导入经理,但经理不能导入模型.

The problem here was the circular dependency errors. I solved this by restructuring my project. So now, managers was a sub-folder inside my models folder. My models can import managers, but managers cannot import models.

为此,我通过使用

self.model

然后,在模型内部,我提到这样的经理:

and then, inside the model, I mention the managers like this:

class SampleModel(models.Model):
    objects = MyManager()
    ...

因此,要实际访问经理,我需要执行模型并做

So to actually access the manager, I take the model and do

model.objects

这样,我不需要直接从models文件夹中访问管理器.希望这可以节省很多人的时间.

this way, I dont need to access the managers directly out of the models folder. Hope this saves someone's time a lot.

@Jarvis回答的也是正确的,但从总体上看,重组我的项目是一个更好的解决方法.

what @Jarvis answered was also right, but at an overall view, restructuring my project was a better fix.

这篇关于django模块'appname'没有属性'models'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆