2016-06-14 2 views
-1

처음에는 나쁜 영어로 유감입니다.두 개 이상의 기존 모델을 장고에 두 개 이상으로 나누는 방법

나는 문제가있다, 나는 약간의 변화를 만들기 위해 장고 애플리케이션을 얻었고 내가해야 할 일 중 하나는 모델을 나누는 것이다. 앱의 일부 모델은 tooooo 크기이기 때문에. 하지만 일부 모델에는 2000 개가 넘는 개체가 있기 때문에 데이터베이스와 정보를 잃어 버릴 수는 없습니다.

나는 SQL에서 몇 가지 쿼리를 할 필요가있을 것이라고 생각하지만, 누군가가 나에게 손이나 아이디어를 줄 수 있다고 생각한다.

class order(models.Model): 
     client = models.ForeignKey(Client) 
     brand = models.CharField(max_length=50) 
     dispositive = models.CharField(max_length=100) 
     serial = models.CharField(max_length=100) 
     work = models.CharField(max_length=50) 
     detail = models.TextField() 
     price = models.IntegerField(default=0) 
     deposit = models.IntegerField(default=0) 
     created_date = models.DateTimeField(
       default=timezone.now) 

그럼 내가이

class Order(models.Model): 
     client = models.ForeignKey(Client) 
     created_date = models.DateTimeField(
       default=timezone.now) 
     published_date = models.DateTimeField(
       blank=True, null=True) 


class OrderDetail(models.Model): 
     order = models.ForeignKey(Order) 
     work = models.CharField(max_length=50) 
     detail = models.TextField() 
     price = models.IntegerField(default=0) 
     deposit = models.IntegerField(default=0) 


class OrderDispositive(models.Model): 
     order = models.ForeignKey(Order) 
     brand = models.CharField(max_length=50) 
     dispositive = models.CharField(max_length=100) 
     serial = models.CharField(max_length=100) 

에 그 모델을 분할해야 내가 원래 모델의

예를 필요의 예입니다 그럼 난 정말 아무 생각이 없다 데이터베이스의 기존 데이터를 잃지 않고이 작업을 수행하는 방법에 대해 알아보십시오!

나는 내가 후 수정 정확한 데이터를 얻을 수있는 전망과 템플릿이 일을 알고 있지만 난 정말 미래의 수정

도와

덕분에 일부 모델을 수정해야합니다!

+1

왜 처음부터 모델을 분할해야합니까? 새 시스템에서는 각 주문에 대해 둘 이상의 OrderDetail 레코드를 가질 수 있습니까? – e4c5

+0

질문에 제시된 모델이 그 예입니다. 한 친구가 큰 모델을 가지고있는 앱의 일부를 구현하고 싶어하지만, 우리가 만들고있는 새로운 앱에는 다른 DB 구조가 있지만 우리가 이것을 만들 수 있다면 구조를 통합 할 수 있습니다! – marcosgue

+0

정확한 정보를 제공하지 않으면 어떻게하면 좋은 대답을 줄 수 있습니까? – e4c5

답변

3

own migrations을 작성하면됩니다.

1 단계 : 원본 모델을 삭제하지 않고 새 모델을 만듭니다.

step2 : 다음으로 실행하십시오.

python manage.py makemigrations app_name 

마이그레이션하기 전에 마이그레이션 파일을 수정하여 다른 테이블에 데이터를 복사하십시오.

your_new_migrations.py

def update_Orderdata(apps, schema_editor): 
    old_order = apps.get_model("some_app", "order") 

    for instance in old_order.objects.all(): 
     # copy data to new order 

def update_OrderDetail(apps, schema_editor): 
    # copy data new tables OrderDetail 

def update_OrderDispositive(apps, schema_editor): 
    # copy data to new table OrderDispositive 

class Migration(migrations.Migration): 

    dependencies = [ 
     # ... your existing dependencies 
    ] 

    operations = [ 


     # original migration, such: 
     # new Order table table, 
     # new OrderDetail table 
     # new OrderDispositive table 

     # add this operation at last... 

     migrations.RunPython(update_Orderdata, reverse_code=migrations.RunPython.noop), 
     migrations.RunPython(update_OrderDetail, reverse_code=migrations.RunPython.noop), 
     migrations.RunPython(update_OrderDispositive, reverse_code=migrations.RunPython.noop), 

    ] 

그런

python manage.py migrate app_name 

3 단계 : 이제 원래 모델 (클래스 순서)를 제거합니다. 데이터베이스의 솔루션 걸릴 백업 위에 시도하기 전에 다음과 makemigration &이

python manage.py makemigrations app_name 
python manage.py migreate app_name 

주를 마이그레이션 실행합니다.

+0

감사합니다 !!! 나는 이것을 시험해보고, 그것이 일하는 방법을 당신에게 알리기 위해 여기에서 돌아갈 것이다!! – marcosgue

관련 문제