Разделить django models.py на несколько файлов внутри папки (Django 3.0.4) - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь разбить models.py на несколько файлов внутри папки.

Как правильно это сделать?

все методы в inte rnet от 8 лет до go и сейчас он не работает.

ОБНОВЛЕНИЕ 1:

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

внутри init .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

1 Ответ

2 голосов
/ 09 марта 2020

Вы можете сделать это, поместив их в папку моделей, например:

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

и __init__.py должны импортировать все модели, содержащиеся в других файлах

from .model_1 import Model1
from .model_2 import Model2

Это вверх вам, чтобы разделить их, в зависимости от того, много ли у вас моделей и строго ли они связаны друг с другом.

Редактировать:

внутри init .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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...