首页 > 解决方案 > 将 django models.py 拆分为文件夹内的多个文件(Django 3.0.4)

问题描述

我正在尝试将models.py拆分为文件夹内的多个文件。

这样做的正确方法是什么?

8年前互联网上的所有方法,现在都行不通了。

更新 1:

test1
    __init__.py
    admin.py
    apps.py
    tests.py
    views.py
    migrations
    models
        __init__.py
        comment.py
        like.py
        post.py
        profile.py

初始化.py里面

from django.db import models
from django.conf import settings

from .like import Like
from .post import Post
from .profile import Profile
from .comment import Comment

里面的comment.py

class Comment(models.Model): 
    commented_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    for_post = models.ForeignKey(Post, on_delete=models.CASCADE)

里面like.py

class Like(models.Model): 
    liked_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)

post.py里面

class Post(models.Model): 
    posted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

里面profile.py

class Profile(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

当我尝试进行迁移时:

python manage.py makemigrations test1

我收到了这个错误:

(sandbox-qFsmxchL) λ python manage.py makemigrations test1
Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\USER\.virtualenvs\sandbox-qFsmxchL\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "C:\Users\USER\.virtualenvs\sandbox-qFsmxchL\lib\site-packages\django\core\management\__init__.py", line 377, in execute
    django.setup()
  File "C:\Users\USER\.virtualenvs\sandbox-qFsmxchL\lib\site-packages\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\Users\USER\.virtualenvs\sandbox-qFsmxchL\lib\site-packages\django\apps\registry.py", line 114, in populate
    app_config.import_models()
  File "C:\Users\USER\.virtualenvs\sandbox-qFsmxchL\lib\site-packages\django\apps\config.py", line 211, in import_models
    self.models_module = import_module(models_module_name)
  File "c:\users\USER\appdata\local\programs\python\python38-32\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\Users\USER\Desktop\sandbox\test1\models\__init__.py", line 4, in <module>
    from .like import Like
  File "C:\Users\USER\Desktop\sandbox\test1\models\like.py", line 2, in <module>
    class Like(models.Model):
NameError: name 'models' is not defined

标签: pythondjangodjango-models

解决方案


您可以将它们放入模型文件夹中,例如:

models/
   - __init__.py
   - model_1.py
   - model_2.py

__init__.py应导入其他文件中包含的所有模型

from .model_1 import Model1
from .model_2 import Model2

取决于您是否有很多模型以及这些模型是否彼此严格相关,由您来拆分它们。

编辑:

初始化.py里面


from .post import Post
from .like import Like
from .profile import Profile
from .comment import Comment

里面的comment.py

from django.db import models
from django.conf import settings

from test1.models import Post


class Comment(models.Model):
    commented_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    for_post = models.ForeignKey(Post, on_delete=models.CASCADE)

里面like.py

from django.db import models
from django.conf import settings

from test1.models import Post


class Like(models.Model): 
    liked_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)

post.py里面

from django.db import models
from django.conf import settings


class Post(models.Model): 
    posted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

里面profile.py

from django.db import models
from django.conf import settings


class Profile(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

推荐阅读