Сплит models.py в несколько файлов

Я пытаюсь разделить models.py моего приложения на несколько файлов:

Мое первое предположение заключалось в следующем:

  • Как решить AttributeError при импорте igraph?
  • Python 2.5.4 - ImportError: нет модуля с именем etree.ElementTree
  • Импортировать функцию из класса в другой файл?
  • Вызов функции из другого файла в Python
  • Импортировать папку модулей в Python
  • Импорт модулей в Python и __init__.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" 

    Итак, нужно ли вручную запускать ссылку на ссылки? это может вызвать проблемы с югом?

  • У Django есть способ открыть HTTP-соединение с длительным опросом?
  • ImportError: не удалось импортировать настройки
  • Ошибка Django: render_to_response () получил неожиданный аргумент ключевого слова 'context_instance'
  • Установка начального значения поля формы Django в методе __init__
  • использовать imaplib и oauth для подключения к Gmail
  • CSV для Python Dictionary со всеми именами столбцов?
  • 3 Solutions collect form web for “Сплит models.py в несколько файлов”

    Я даже не могу представить, почему вы хотите это сделать. Но я предполагаю, что у тебя есть веская причина. Если мне нужно было это сделать по какой-то причине, я бы сделал следующее:

     myproject/ ... app1/ views.py __init__.py models.py submodels/ __init__.py model1.py model2.py app2/ views.py __init__.py models.py submodels/ __init__.py model3.py model4.py 

    затем

     #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:

     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/

    Для тех, кто на Django 1.9, теперь поддерживается каркасом без определения метаданных класса.

    https://docs.djangoproject.com/en/1.9/topics/db/models/#organizing-models-in-a-package

    Команда manage.py startapp создает структуру приложения, которая включает файл models.py. Если у вас много моделей, может быть полезно организовать их в отдельных файлах.

    Для этого создайте пакет моделей. Удалите models.py и создайте каталог myapp/models/ с файлом __init__.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 

    Вам нужно только сделать

     #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 

    Примечание против импорта всех классов:

    Явно импортировать каждую модель, а не использовать from .models import * имеет преимущества не загромождать пространство имен, делая код более удобочитаемым и сохраняя инструменты анализа кода полезными.

    На самом деле я натолкнулся на учебное пособие, о котором вы спрашиваете, вы можете посмотреть его здесь:

    http://paltman.com/breaking-apart-models-in-django/

    Один из ключевых моментов, который, вероятно, имеет значение, – вы можете использовать поле db_table в классе Meta, чтобы переместить перемещенные классы обратно в их собственную таблицу.

    Я могу подтвердить, что этот подход работает в Django 1.3

    Python - лучший язык программирования в мире.