2013-07-11 2 views
1

"User"를 가리키는 외래 키가있는 "Realm"모델에 "is_capital"필드를 추가했습니다. 이는 모습입니다남쪽으로 고급 마이그레이션을 작성하십시오

같은 : 기본적으로

class Realm(models.Model): 
    user = models.ForeignKey(User) 
    is_capital = models.BooleanField(default=False) #field not synced yet 
    #... 

, 나는 사용자 당 모든 레코드가 "is_capital"플래그는 모든 거짓하지만 첫 번째 (또는 임의의 하나)로 설정하도록합니다. 결국에는 사용자 당 하나의 "영역"플래그가 지정된 "is_capital"만 있어야합니다.

그래서 표는 결국 다음과 같아야합니다

영역

realm_id ; user_id ; is_capital 
1 ; 1 ; True 
2 ; 1 ; False 
3 ; 1 ; False 
4 ; 2 ; True 
5 ; 2 ; False 

가 어떻게 이러한 마이그레이션을 할 수 있습니까? 필자가 보았던 모든 예는 새 열을 단일 값으로 채우는 것입니다.

답변

1

스키마 마이 그 레이션을 추가하여 default=False 필드를 추가하십시오.

python manage.py schemamigration app_name --auto 

이 마이그레이션을 실행하십시오.

그리고 쓰기, 생성 된 마이그레이션 파일의 당신의 forwards()에서 변경

./manage.py datamigration app_name mark_is_capital 

을 만들기위한 데이터 마이그레이션을 만들 : 몇 가지 변화와

for user in orm.User.objects.all(): 
    realms = orm.Realm.objects.filter(user=user) 
    if realms: 
     realm_to_change = realms[0] 
     realm_to_change.is_capital = True 
     realm_to_change.save() 
+0

을, 마치 마법처럼 덕분에 일을하면 좋은 선생님 ! 먼저 django.contrib.auth.models에서 사용자를 가져와야 만했습니다. 그런 다음 간단한 ./manage.py 마이그레이션이 충분했습니다. – BiAiB

+0

다행 :) –