2012-04-12 5 views
2

모델과 양식을 변경하기 전까지 내 UserProfile이 제대로 작동했습니다. 모델에 DateField를 추가하고 Forms.py 및 템플릿을 업데이트했습니다. 또한 syncdb도했습니다.Django 모델에서 새 필드를 추가 한 후 오류가 발생했습니다.

프로필/models.py

class UserProfiles(models.Model): 
    user = models.OneToOneField(User) 
    #other fields here 
    birthday = models.DateField() 

프로필/forms.py

class UserProfileForm(ModelForm): 
    class Meta: 
     model = UserProfiles 
     fields = ('some_field', 'birthday', 'otherfields') 

프로필/views.py

def editprofile(request): 
    return render_to_response('profile_edit.html', {'form':UserProfileForm()}, context_instance=RequestContext(request)) 

이는 던지고 에러이다.

Traceback: 
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response 
    111.       response = callback(request, *callback_args, **callback_kwargs) 
File "E:\django-sample\proschools\..\proschools\profile\views.py" in generateprofile 
    12.    userprofile = UserProfiles.objects.get(user=request.user) 
File "C:\Python27\lib\site-packages\django\db\models\manager.py" in get 
    132.   return self.get_query_set().get(*args, **kwargs) 
File "C:\Python27\lib\site-packages\django\db\models\query.py" in get 
    344.   num = len(clone) 
File "C:\Python27\lib\site-packages\django\db\models\query.py" in __len__ 
    82.     self._result_cache = list(self.iterator()) 
File "C:\Python27\lib\site-packages\django\db\models\query.py" in iterator 
    273.   for row in compiler.results_iter(): 
File "C:\Python27\lib\site-packages\django\db\models\sql\compiler.py" in results_iter 
    680.   for rows in self.execute_sql(MULTI): 
File "C:\Python27\lib\site-packages\django\db\models\sql\compiler.py" in execute_sql 
    735.   cursor.execute(sql, params) 
File "C:\Python27\lib\site-packages\django\db\backends\util.py" in execute 
    34.    return self.cursor.execute(sql, params) 
File "C:\Python27\lib\site-packages\django\db\backends\mysql\base.py" in execute 
    86.    return self.cursor.execute(query, args) 
File "C:\Python27\lib\site-packages\MySQLdb\cursors.py" in execute 
    174.    self.errorhandler(self, exc, value) 
File "C:\Python27\lib\site-packages\MySQLdb\connections.py" in defaulterrorhandler 
    36.  raise errorclass, errorvalue 

Exception Type: OperationalError at /profile/ 
Exception Value: (1054, "Unknown column 'profile_userprofiles.birthday' in 'field list'") 

답변

2

새 열을 추가하기 전에 테이블이 존재하면 syncdb은 새 열을 추가하지 않습니다! syncdbdoes not alter existing tables. Django south을 사용하거나 수동으로 열을 추가하십시오.

+0

수동으로 생성하는 경우 예방 조치가 있습니까? 아니면 그냥 가서 테이블을 수동으로 mysql을 사용하여 워크 벤치 및 그게 전부? – John

+0

@ John 이상적으로 남쪽 앱을 사용합니다. 그러나 단 한 열의 경우 성가 시게됩니다. 특정'app'에 [sqlall] (https://docs.djangoproject.com/en/dev/ref/django-admin/#sqlall-appname-appname)을 실행하면 Django 자체에서 사용했던 DDL 구문을 정확히 알 수 있습니다 그것을 만들어라. –

1

Syncdb가 자동으로 새 필드를 만들지 않습니다. 스키마 변경 사항을 DB에 적용하려면 테이블을 완전히 삭제하고 syncdb를 실행해야합니다.

대부분의 django 개발자는 south이라는 타사 응용 프로그램을 사용하여 이러한 유형의 마이그레이션을 처리합니다. South는 필드를 추가하고 데이터베이스를 다시 만들거나 수동으로 데이터베이스를 변경하지 않고도 데이터베이스를 마이그레이션 할 수 있도록합니다. 당신이 ./manage.py syncdb를 실행하면

2
http://code.google.com/p/django-evolution/ 

는 장고 정의 된 새로운 모델을 찾아, 그 새로운 모델을 표현하기 위해 데이터베이스 테이블을 추가합니다. 그러나 기존 모델을 변경하면 ./manage.py syncdb가 데이터베이스를 변경하지 않습니다.

Django Evolution은 Django의 확장 기능으로 시간 경과에 따른 모델의 변경 사항을 추적하고 이러한 변경 사항을 반영하도록 데이터베이스를 업데이트 할 수 있습니다.

관련 문제