2012-04-12 19 views
2

Mein UserProfile funktionierte gut, bis ich das Modell und Form änderte. Ich habe ein DateField im Modell hinzugefügt und meine Forms.py und Vorlage aktualisiert. Habe auch eine Syncdb gemacht.Fehler nach dem Hinzufügen eines neuen Feldes in Django Models

profile/models.py

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

profile/forms.py

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

profile/views.py

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

Dies ist der Fehler, den es zu werfen ist.

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'") 

Antwort

2

Wenn die Tabelle, bevor Sie die neue Spalte syncdb keine neuen Spalten, um es hinzuzufügen hinzugefügt existierte! syncdbdoes not alter existing tables. Erwägen Sie die Verwendung von Django south oder fügen Sie die Spalte manuell hinzu.

+0

Wenn ich manuell erstelle, gibt es irgendwelche Vorsichtsmaßnahmen? Oder ich gehe einfach und fügen Sie manuell die Tabelle mit mysql workbench hinzu und das ist es? – John

+0

@John Idealerweise verwenden Sie die South App. Für nur eine Spalte kann es jedoch mühsam sein. Die Ausführung von [sqlall] (https://docs.djangoproject.com/en/dev/ref/django-admin/#sqlall-appname-appname) auf Ihrer spezifischen 'app' sagt Ihnen genau, was DDL-Syntax Django selbst verwendet hätte erstelle es. –

1

Syncdb erstellt nicht automatisch neue Felder für Sie. Sie müssten die Tabelle vollständig löschen und syncdb ausführen, um die Schemaänderungen auf die Datenbank anzuwenden.

Die meisten Django-Entwickler verwenden eine Drittanbieter-App namens south, um diese Arten von Migrationen zu behandeln. Mit South können Sie Felder hinzufügen und die Datenbank migrieren, ohne sie neu erstellen oder die Datenbank manuell ändern zu müssen.

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

Wenn Sie ./manage.py syncdb ausführen, wird Django für alle neuen Modelle sehen, die definiert wurden, und eine Datenbank-Tabelle hinzufügen, um diese neuen Modelle zu repräsentieren. Wenn Sie jedoch ein vorhandenes Modell ändern, werden von ./manage.py syncdb keine Änderungen an der Datenbank vorgenommen.

Hier kommt Django Evolution ins Spiel. Django Evolution ist eine Erweiterung von Django, mit der Sie Änderungen an Ihren Modellen im Laufe der Zeit verfolgen und die Datenbank aktualisieren können, um diese Änderungen zu berücksichtigen.

Verwandte Themen