sourcecode

models.py 을 여러 파일로 분할합니다.

codebag 2023. 8. 11. 21:45
반응형

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"

그래서, 제가 참조를 위해 수동으로 수정기를 실행해야 하나요?이것이 남쪽에 문제를 가져올 수 있습니까?

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

https://docs.djangoproject.com/en/1.9/topics/db/models/ #패키지에 포함된 패키지 구성

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

manage.py startapp명령은 models.py 파일을 포함하는 응용 프로그램 구조를 만듭니다.모델이 많은 경우 별도의 파일로 구성하는 것이 유용할 수 있습니다.

이렇게 하려면 모델 패키지를 생성합니다..py 을 .py 을 .myapp/models/가 " " " (" " " " " " " " 인 경우)로 됩니다.__init__.py파일 및 모델을 저장할 파일.에모델가합야에 있는 합니다.__init__.pyjava.

그래서, 당신의 경우에는, 다음과 같은 구조를 위해.

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 *네임스페이스를 복잡하게 만들지 않고 코드를 더 쉽게 읽을 수 있게 하며 코드 분석 도구를 유용하게 유지할 수 있는 장점이 있습니다.

다음을 수행합니다.

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 *

다만, 정당한 이유가 없다면 app1/models.py 에 model1과 model2를 직접 넣고 app2/models.py 에 model3와 model4를 넣어주세요.

---세컨드 파트---

다음은 app1/models/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-schedjango-schedule.https://github.com/thauber/django-schedule/tree/master/schedule/models https://github.com/thauber/django-schedule/

질문하신 내용에 대한 튜토리얼을 실제로 발견했습니다. 여기에서 확인할 수 있습니다.

https://web.archive.org/web/20190331105757/http ://paltman.com/breaking-apart-models-in-django/

한 가지 중요한 점은 Meta 클래스의 db_table 필드를 사용하여 재배치된 클래스가 자신의 테이블을 다시 가리키도록 하는 것입니다.

이 접근 방식이 장고 1.3에서 작동하고 있음을 확인할 수 있습니다.

장고 3의 관련 링크는 다음과 같습니다.

https://docs.djangoproject.com/en/3.2/topics/db/models/ #패키지에 포함된 패키지 구성

이전 버전의 설명서에 대한 링크가 끊어졌습니다.여기에 있는 예는 매우 간결합니다.

이렇게 하려면 모델 패키지를 생성합니다.models.py 제거하고 init.py 파일과 모델을 저장할 파일이 있는 myapp/sys/ 디렉토리를 만듭니다.init.py 파일에 있는 모델을 가져와야 합니다.

예를 들어 모델 디렉토리에 organic.py 및 synthetic.py 이 있는 경우:

from .organic import Person
from .synthetic import Robot

가장 쉬운 단계:

  1. 앱에 모델 폴더 만들기(폴더 이름은 모델이어야 함)
  2. 앱 디렉터리에서 model.py 파일 삭제(삭제하는 동안 파일 백업)
  3. 그리고 모델 폴더에 init.py 파일을 만든 후
  4. 그리고 init.py 파일 뒤에 간단한 한 줄을 씁니다.
  5. 모델 폴더에 모델 파일을 생성한 후 모델 파일 이름은 클래스 이름과 같아야 하며, 클래스 이름이 '직원'인 경우 모델 파일 이름은 '직원'과 같아야 합니다.파이'
  6. 그리고 모델 파일 뒤에 데이터베이스 테이블을 model.py 파일과 동일하게 정의합니다.
  7. 구하라

내 코드 : from django_adminlte.models.employee importEmployee

의 경우: 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

저는 유용할 수 있는 대본을 썼습니다.

github.com/victorqribeiro/splitDjangoModels

모델을 개별 파일로 분할하여 적절한 이름을 지정하고 가져오기만 하면 됩니다. 또한 init 파일을 만들어 모든 모델을 한 번에 가져올 수 있습니다.

이게 도움이 된다면 알려주세요.

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

반응형