Я пытаюсь разбить models.py
свое приложение на несколько файлов:
Мое первое предположение было сделать это:
myproject/
settings.py
manage.py
urls.py
__init__.py
app1/
views.py
__init__.py
models/
__init__.py
model1.py
model2.py
app2/
views.py
__init__.py
models/
__init__.py
model3.py
model4.py
Это не работает, потом я нашел это , но в этом решении у меня все еще проблема, когда я бегу, python manage.py sqlall app1
я получаю что-то вроде:
BEGIN;
CREATE TABLE "product_product" (
"id" serial NOT NULL PRIMARY KEY,
"store_id" integer NOT NULL
)
;
-- The following references should be added but depend on non-existent tables:
-- ALTER TABLE "product_product" ADD CONSTRAINT "store_id_refs_id_3e117eef" FOREIGN KEY ("store_id") REFERENCES "store_store" ("id") DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "product_product_store_id" ON "product_product" ("store_id");
COMMIT;
Я не совсем уверен в этом, но меня беспокоит часть The following references should be added but depend on non-existent tables:
Это мой файл model1.py:
from django.db import models
class Store(models.Model):
class Meta:
app_label = "store"
Это мой файл model3.py:
from django.db import models
from store.models import Store
class Product(models.Model):
store = models.ForeignKey(Store)
class Meta:
app_label = "product"
И, по-видимому, работает, но я получил комментарий, alter table
и если я попробую это, произойдет то же самое:
class Product(models.Model):
store = models.ForeignKey('store.Store')
class Meta:
app_label = "product"
Итак, следует ли мне запускать альтер для ссылок вручную? это может доставить мне проблемы с югом?
python
django
django-models
import
Diegueus9
источник
источник
from app1.models.model1 import Store
?Ответы:
Я бы сделал следующее:
затем
#myproject/app1/models.py: from submodels/model1.py import * from submodels/model2.py import * #myproject/app2/models.py: from submodels/model3.py import * from submodels/model4.py import *
Но, если у вас нет веской причины, поместите model1 и model2 непосредственно в app1 / models.py, а model3 и model4 в app2 / models.py.
---вторая часть---
Это файл app1 / submodels / model1.py:
from django.db import models class Store(models.Model): class Meta: app_label = "store"
Таким образом исправьте ваш файл model3.py:
from django.db import models from app1.models import Store class Product(models.Model): store = models.ForeignKey(Store) class Meta: app_label = "product"
Отредактировано, на случай, если это снова у кого-то возникнет: ознакомьтесь с django-schedule для примера проекта, который делает именно это. https://github.com/thauber/django-schedule/tree/master/schedule/models https://github.com/thauber/django-schedule/
источник
from product.models import Product
: ImportError: нет модуля с именем modelsmodels.py
файла. Я недавно сделал это, когда мой код вырос до более 15 тысяч строк. Хотя отличная рецензия. Процесс довольно простой. Главное предостережение в том, что вы должны не забыть определить явную app_label, поскольку Django по умолчанию извлекает ее из непосредственного модуля.__init__.py
и вроде все работает нормально. Мне не пришлось исправлять файлы моей модели. Я могу получать и создавать объекты из оболочки и администратора django. Я пробовал django около недели, поэтому мне интересно, позволяет ли это теперь самая новая версия?Для всех, кто использует Django 1.9, теперь он поддерживается фреймворком без определения метаданных класса.
https://docs.djangoproject.com/en/1.9/topics/db/models/#organizing-models-in-a-package
ПРИМЕЧАНИЕ. Для Django 2 все то же самое.
Итак, в вашем случае для такой структуры, как
Вам нужно только сделать
#myproject/app1/models/__init__.py: from .model1 import Model1 from .model2 import Model2 #myproject/app2/models/__init__.py: from .model3 import Model3 from .model4 import Model4
Примечание против импорта всех классов:
источник
models.py
и хотите выполнить миграцию позже. В этом случае вам нужно удалить свои миграции и свою базу данных: / Или вручную устранить все ошибки во всех файлах миграцииЯ действительно наткнулся на учебник именно по тому, о чем вы спрашиваете, вы можете просмотреть его здесь:
http://paltman.com/breaking-apart-models-in-django/
Один ключевой момент, который, вероятно, имеет значение - вы можете использовать поле db_table в классе Meta, чтобы указать перемещенным классам обратно в их собственную таблицу.
Я могу подтвердить, что этот подход работает в Django 1.3.
источник
Самые простые шаги:
__init__.py from django_adminlte.models.employee import Employee
model/employee.py (employee is separate model file) from django.db import models class Employee(models.Model): eid = models.CharField(max_length=20) ename = models.CharField(max_length=20) eemail = models.EmailField() econtact = models.CharField(max_length=15) class Meta: db_table = "employee" # app_label = 'django_adminlte' def __str__(self): return self.ename
источник
RuntimeError ModelX doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
в django 2.x.Я написал сценарий, который может пригодиться.
github.com/victorqribeiro/splitDjangoModels
он разбивает модели на отдельные файлы с правильным наименованием и импортом; он также создает файл инициализации, чтобы вы могли импортировать все свои модели сразу.
Позвольте мне знать, если это помогает
источник