developer tip

models.py를 여러 파일로 분할

copycodes 2020. 10. 21. 08:13
반응형

models.py를 여러 파일로 분할


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"

그렇다면 참조를 위해 변경을 수동으로 실행해야합니까? 이것이 남쪽에 문제를 일으킬 수 있습니까?


다음을 수행합니다.

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.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/


Django 1.9의 모든 사용자는 이제 클래스 메타 데이터를 정의하지 않고 프레임 워크에서 지원합니다.

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

참고 : Django 2 의 경우 여전히 동일합니다.

manage.py startapp명령은 models.py 파일을 포함하는 애플리케이션 구조를 생성합니다. 모델이 많은 경우 별도의 파일로 구성하는 것이 유용 할 수 있습니다.

To do so, create a models package. Remove models.py and create a myapp/models/ directory with an __init__.py file and the files to store your models. You must import the models in the __init__.py file.

So, in your case, for a structure like

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

You only need to do

#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

A note against importing all the classes:

Explicitly importing each model rather than using from .models import * has the advantages of not cluttering the namespace, making code more readable, and keeping code analysis tools useful.


I've actually come across a tutorial for exactly what you're asking about, you can view it here:

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

One key point that's probably relevant - you may want to use the db_table field on the Meta class to point the relocated classes back at their own table.

I can confirm this approach is working in Django 1.3


Easiest Steps :

  1. Create model folder in your app (Folder name should be model)
  2. Delete model.py file from app directory (Backup the file while you delete it)
  3. And after create init.py file in model folder
  4. And after init.py file in write simple one line
  5. And after create model file in your model folder and model file name should be same like as class name,if class name is 'Employee' than model file name should be like 'employee.py'
  6. And after in model file define your database table same as write like in model.py file
  7. Save it

My Code : from django_adminlte.models.employee import Employee

For your : from app_name.models.model_file_name_only import Class_Name_which_define_in_model_file


__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

I wrote a script that might be useful.

github.com/victorqribeiro/splitDjangoModels

it split the models in individual files with proper naming and importing; it also create an init file so you can import all your models at once.

let me know if this helps

참고URL : https://stackoverflow.com/questions/6336664/split-models-py-into-several-files

반응형