簡體   English   中英

django 模塊“appname”沒有屬性“models”

[英]django module 'appname' has no attribute 'models'

在我刪除 venv 並使用 pycharm 重新創建它之后,直到今天一切正常。 現在,無論我用 django 運行什么命令,它都會拋出這個錯誤:

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,再次創建並運行

python -r requirements.txt

但是,我不能做任何其他事情——沒有遷移或運行服務器。 為什么會這樣? 是因為循環依賴錯誤嗎?

project structure

項目結構

以下是回溯中提到的文件: models/ init .py

from .data_sheets import *
from .roles import *

模型/數據表.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

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

經理/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

有人可以幫我解決這個錯誤嗎? 如果需要,我需要轉換哪些模型? 感謝您抽出寶貴的時間!

您需要在根目錄api_backend中添加一個__init__.py ,以便將此文件夾視為 package(類似於您在其他子文件夾/包中添加的那些,例如/migrations/models/serializers等.)。

編輯:您可以在managers/field_data.py中像這樣從models文件夾中進行相對導入:

import os, sys
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..'))
import models as api_models

這里的問題是循環依賴錯誤。 我通過重組我的項目解決了這個問題。 所以現在,managers 是我的模型文件夾中的一個子文件夾。 我的模型可以導入經理,但經理不能導入模型。

為了實現這一點,我通過使用從經理那里引用了 model

self.model

然后,在 model 內部,我提到了這樣的管理器:

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

因此,要實際訪問管理器,我使用 model 並執行

model.objects

這樣,我不需要直接從模型文件夾中訪問管理器。 希望這可以節省很多人的時間。

@Jarvis 的回答也是正確的,但總的來說,重組我的項目是一個更好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM