J'essaye de diviser le models.py
de mon application en plusieurs fichiers:
Ma première hypothèse était de faire ceci:
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
Cela ne fonctionne pas, alors j'ai trouvé cela , mais dans cette solution, j'ai toujours un problème, quand je cours, python manage.py sqlall app1
j'ai quelque chose comme:
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;
Je ne suis pas sûr de ça, mais je m'inquiète pour la partie The following references should be added but depend on non-existent tables:
Ceci est mon fichier model1.py:
from django.db import models
class Store(models.Model):
class Meta:
app_label = "store"
Ceci est mon fichier 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"
Et fonctionne apparemment mais j'ai reçu le commentaire alter table
et si j'essaye ceci, la même chose se produit:
class Product(models.Model):
store = models.ForeignKey('store.Store')
class Meta:
app_label = "product"
Alors, dois-je exécuter l'alter pour les références manuellement? cela peut me poser des problèmes avec le sud?
python
django
django-models
import
diegueus9
la source
la source
from app1.models.model1 import Store
?Réponses:
Je ferais ce qui suit:
ensuite
#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 *
Mais, si vous n'avez pas de bonne raison, placez model1 et model2 directement dans app1 / models.py et model3 et model4 dans app2 / models.py
---deuxième partie---
Il s'agit du fichier app1 / submodels / model1.py:
from django.db import models class Store(models.Model): class Meta: app_label = "store"
Corrigez donc votre fichier 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"
Modifié, au cas où cela se reproduirait pour quelqu'un: consultez django-schedule pour un exemple de projet qui fait exactement cela. https://github.com/thauber/django-schedule/tree/master/schedule/models https://github.com/thauber/django-schedule/
la source
from product.models import Product
: ImportError: Aucun module nommé modelsmodels.py
fichier volumineux . J'ai récemment fait cela lorsque le mien est passé à plus de 15 000 lignes de code. Excellent article cependant. Le processus est assez simple. La principale mise en garde étant que vous devez vous rappeler de définir un app_label explicite, car Django extrait cela du module immédiat par défaut.__init__.py
et tout semble fonctionner correctement. Je n'ai pas eu à corriger mes fichiers modèles. Je suis capable de récupérer et de créer des objets à partir du shell et de l'administrateur django. J'essaye django depuis une semaine, alors je me demande si la dernière version permet maintenant que cela se produise?Pour quiconque sur Django 1.9, il est désormais pris en charge par le framework sans définir les métadonnées de classe.
https://docs.djangoproject.com/en/1.9/topics/db/models/#organizing-models-in-a-package
NOTE: pour Django 2, c'est toujours la même
Donc, dans votre cas, pour une structure comme
Il suffit de faire
#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
Une note contre l'importation de toutes les classes:
la source
models.py
et que vous souhaitez migrer plus tard. Dans ce cas, vous devez supprimer vos migrations et votre base de données: / Ou résoudre manuellement toutes les erreurs dans tous les fichiers de migrationEn fait, je suis tombé sur un tutoriel pour exactement ce que vous demandez, vous pouvez le voir ici:
http://paltman.com/breaking-apart-models-in-django/
Un point clé qui est probablement pertinent - vous pouvez utiliser le champ db_table sur la classe Meta pour renvoyer les classes déplacées vers leur propre table.
Je peux confirmer que cette approche fonctionne dans Django 1.3
la source
Étapes les plus faciles:
__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
la source
RuntimeError ModelX doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
dans django 2.x.J'ai écrit un script qui pourrait être utile.
github.com/victorqribeiro/splitDjangoModels
il divise les modèles en fichiers individuels avec un nom et une importation appropriés; il crée également un fichier init afin que vous puissiez importer tous vos modèles à la fois.
laissez-moi savoir si cela aide
la source