Saya mencoba membagi models.py
aplikasi saya menjadi beberapa file:
Tebakan pertama saya adalah melakukan ini:
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
Ini tidak berhasil, lalu saya menemukan ini , tetapi dalam solusi ini saya masih memiliki masalah, ketika saya menjalankan python manage.py sqlall app1
saya mendapat sesuatu seperti:
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;
Saya tidak begitu yakin tentang ini, tapi saya khawatir tentang bagian itu The following references should be added but depend on non-existent tables:
Ini adalah file model1.py saya:
from django.db import models
class Store(models.Model):
class Meta:
app_label = "store"
Ini adalah file model3.py saya:
from django.db import models
from store.models import Store
class Product(models.Model):
store = models.ForeignKey(Store)
class Meta:
app_label = "product"
Dan ternyata berfungsi tetapi saya mendapat komentar alter table
dan jika saya mencoba ini, hal yang sama terjadi:
class Product(models.Model):
store = models.ForeignKey('store.Store')
class Meta:
app_label = "product"
Jadi, haruskah saya menjalankan perubahan untuk referensi secara manual? ini mungkin membawa saya masalah dengan selatan?
python
django
django-models
import
diegueus9
sumber
sumber
from app1.models.model1 import Store
?Jawaban:
Saya akan melakukan hal berikut:
Kemudian
#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 *
Tapi, jika Anda tidak memiliki alasan yang tepat, letakkan model1 dan model2 langsung di app1 / models.py dan model3 dan model4 di app2 / models.py
---bagian kedua---
Ini adalah file app1 / submodels / model1.py:
from django.db import models class Store(models.Model): class Meta: app_label = "store"
Jadi perbaiki file model3.py Anda:
from django.db import models from app1.models import Store class Product(models.Model): store = models.ForeignKey(Store) class Meta: app_label = "product"
Diedit, jika ini muncul lagi untuk seseorang: Lihat django-schedule untuk contoh proyek yang melakukan hal ini. https://github.com/thauber/django-schedule/tree/master/schedule/models https://github.com/thauber/django-schedule/
sumber
from product.models import Product
: ImportError: No module bernama modelsmodels.py
file yang sangat besar . Saya baru-baru ini melakukan ini ketika milik saya berkembang menjadi lebih dari 15k baris kode. Tulisan yang bagus sekalipun. Prosesnya cukup sederhana. Peringatan utamanya adalah anda harus ingat untuk mendefinisikan label_aplikasi eksplisit, karena Django mengekstrak ini dari modul langsung secara baku.__init__.py
dan semuanya tampak berfungsi dengan baik. Saya tidak perlu mengoreksi file model saya. Saya dapat mengambil dan membuat objek dari shell dan admin django. Saya sudah mencoba Django selama seminggu jadi saya bertanya-tanya apakah versi terbaru sekarang memungkinkan hal ini terjadi?Untuk siapa saja di Django 1.9, sekarang didukung oleh kerangka kerja tanpa mendefinisikan meta data kelas.
https://docs.djangoproject.com/en/1.9/topics/db/models/#organizing-models-in-a-package
CATATAN: Untuk Django 2, itu masih sama
Jadi, dalam kasus Anda, untuk struktur seperti
Anda hanya perlu melakukannya
#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
Catatan terhadap mengimpor semua kelas:
sumber
models.py
dan ingin bermigrasi nanti. Dalam hal ini, Anda harus menghapus migrasi dan database Anda: / Atau untuk secara manual menyelesaikan semua kesalahan di semua file migrasiSaya benar-benar menemukan tutorial tentang apa yang Anda tanyakan, Anda dapat melihatnya di sini:
http://paltman.com/breaking-apart-models-in-django/
Satu poin kunci yang mungkin relevan - Anda mungkin ingin menggunakan bidang db_table di kelas Meta untuk mengarahkan kembali kelas yang direlokasi ke tabel mereka sendiri.
Saya dapat mengkonfirmasi pendekatan ini bekerja di Django 1.3
sumber
Langkah termudah:
__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
sumber
RuntimeError ModelX doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
di django 2.x.Saya menulis naskah yang mungkin berguna.
github.com/victorqribeiro/splitDjangoModels
itu membagi model dalam file individual dengan penamaan dan impor yang tepat; itu juga membuat file init sehingga Anda dapat mengimpor semua model Anda sekaligus.
beri tahu saya jika ini membantu
sumber