Как создать пакет моделей в Django

avatar
Lucas
7 апреля 2018 в 23:12
2820
3
3

Имея довольно большой файл models.py (который содержит несколько моделей), я пытаюсь выполнить рефакторинг с одной моделью на файл.

Поэтому я пытаюсь создать пакет models со следующей структурой:

  • app/models/__init__.py
  • app/models/first_model.py
  • app/models/second_model.py

К сожалению, я не могу заставить механизм отложенных ссылок Django работать нормально, т.е.:

first_model = models.ForeignKey('app.FirstModel')

возвращает ошибку, что Django не может найти модель.

Есть идеи? Спасибо!

Источник

Ответы (3)

avatar
user7485741
8 апреля 2018 в 05:40
4

Это должно работать, убедитесь, что в __init__.py вы импортируете все модели из first_model.py и second_model.py.

from .first_model import FirstModel
from .second_model import SecondModel

РЕДАКТИРОВАТЬ: Если вы хотите получить модели как 'app_label.model_name', вам придется импортировать их в __init__.py, в противном случае вы можете попробовать следующее:

Используйте https://docs.djangoproject.com/en/2.0/ref/applications/#django.apps.apps.get_model

Или вы можете использовать ContentTypes: https://docs.djangoproject.com/en/2.0/ref/contrib/contenttypes/#methods-on-contenttype-instances

Lucas
8 апреля 2018 в 05:44
0

Спасибо, но это действительно не проблема здесь. Проблема в том, что Django не может найти их, используя ленивую ссылку.

avatar
Lemayzeur
9 мая 2018 в 22:10
2

Наличие __init__.py сообщает Python, что нужно рассматривать его как пакет, но чтобы позволить Django найти ваши модели для миграции и найти их правильно, вы должны импортировать все свои модели в __init__.py

Оставить структуру такой, какой она была:

app/models/__init__.py
app/models/first_model.py
app/models/second_model.py

__init__.py

from .first_models import *
from .second_models import *
avatar
Fuhrmanator
9 мая 2018 в 21:49
0

В поваренной книге есть пример, в котором используется только имя класса (модели), а не часть приложения:

first_model = models.ForeignKey('FirstModel')