[英]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.