Estou tentando dividir o models.py
do meu aplicativo em vários arquivos:
Meu primeiro palpite foi fazer isto:
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
Isso não funciona, então eu achei isso , mas nesta solução ainda tenho um problema, quando eu executo python manage.py sqlall app1
eu tenho algo como:
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;
Não tenho certeza sobre isso, mas estou preocupado com a parte The following references should be added but depend on non-existent tables:
Este é meu arquivo model1.py:
from django.db import models
class Store(models.Model):
class Meta:
app_label = "store"
Este é meu arquivo 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"
E aparentemente funciona, mas eu tenho o comentário alter table
e se eu tentar isso, acontece a mesma coisa:
class Product(models.Model):
store = models.ForeignKey('store.Store')
class Meta:
app_label = "product"
Portanto, devo executar o alter para referências manualmente? isso pode me trazer problemas com o sul?
python
django
django-models
import
diegueus9
fonte
fonte
from app1.models.model1 import Store
?Respostas:
Eu faria o seguinte:
Então
#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 *
Mas, se você não tiver um bom motivo, coloque model1 e model2 diretamente em app1 / models.py e model3 e model4 em app2 / models.py
---segunda parte---
Este é o arquivo app1 / submodels / model1.py:
from django.db import models class Store(models.Model): class Meta: app_label = "store"
Portanto, corrija seu arquivo 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"
Editado, caso isso aconteça novamente para alguém: Verifique django-schedule para ver um exemplo de projeto que faz exatamente isso. https://github.com/thauber/django-schedule/tree/master/schedule/models https://github.com/thauber/django-schedule/
fonte
from product.models import Product
: ImportError: Nenhum módulo chamado modelsmodels.py
arquivo enorme . Recentemente fiz isso quando o meu cresceu para mais de 15 mil linhas de código. Grande redação embora. O processo é bastante simples. A principal advertência é que você deve se lembrar de definir um app_label explícito, já que o Django extrai isso do módulo imediato por padrão.__init__.py
e tudo parece estar funcionando bem. Não precisei corrigir meus arquivos de modelo. Sou capaz de buscar e criar objetos do shell e do administrador django. Estou tentando django há uma semana, então estou me perguntando se a versão mais recente agora permite que isso aconteça.Para qualquer pessoa no Django 1.9, agora é suportado pelo framework sem definir os metadados da classe.
https://docs.djangoproject.com/en/1.9/topics/db/models/#organizing-models-in-a-package
NOTA: Para Django 2, ainda é o mesmo
Então, no seu caso, para uma estrutura como
Você só precisa fazer
#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
Uma observação contra a importação de todas as classes:
fonte
models.py
e deseja migrar mais tarde. Nesse caso, você deve excluir suas migrações e seu banco de dados: / Ou resolver manualmente todos os erros em todos os arquivos de migraçãoNa verdade, encontrei um tutorial para exatamente o que você está perguntando, você pode visualizá-lo aqui:
http://paltman.com/breaking-apart-models-in-django/
Um ponto-chave que provavelmente é relevante - você pode querer usar o campo db_table na classe Meta para apontar as classes realocadas de volta para sua própria tabela.
Posso confirmar que essa abordagem está funcionando no Django 1.3
fonte
Passos mais fáceis:
__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
fonte
RuntimeError ModelX doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
no django 2.x.Eu escrevi um script que pode ser útil.
github.com/victorqribeiro/splitDjangoModels
divide os modelos em arquivos individuais com nomenclatura e importação adequadas; ele também cria um arquivo init para que você possa importar todos os seus modelos de uma vez.
avise-me se isso ajudar
fonte