{"id":1271,"date":"2018-03-06T11:23:44","date_gmt":"2018-03-06T11:23:44","guid":{"rendered":"https:\/\/www.taywa.ch\/blog\/?p=1271"},"modified":"2018-03-06T11:24:48","modified_gmt":"2018-03-06T11:24:48","slug":"django-upgrade-1-6-auf-1-11","status":"publish","type":"post","link":"https:\/\/www.taywa.ch\/blog\/django\/django-upgrade-1-6-auf-1-11\/","title":{"rendered":"django upgrade 1.6 auf 1.11"},"content":{"rendered":"<p>Hier eine Zusammenfassung einiger Upgradeschritte die n\u00f6tigen waren um ein django 1.6 Projekt auf django 1.11 upzugraden.<\/p>\n<h3>Migrations<\/h3>\n<p class=\"\">In django 1.6 wurde in der Regel django south f\u00fcr Datenbankmigrationen benutzt seit Version 1.7 besitzt django selber\u00a0Datenbankmigrationen.<\/p>\n<p>Als erstes muss man alle eigenen south migrationen l\u00f6schen z.B. mit<\/p>\n<pre class=\"\">find . -type file|grep \/migrations\/ | xargs rm<\/pre>\n<p>dies l\u00f6scht alle migrations files im aktuellen folder und tiefer.<\/p>\n<p>Als n\u00e4chstes muss man die initialen migrations wieder anlegen, und fake migrations ausf\u00fchren, da man die Tabellen nicht ge\u00e4ndert<\/p>\n<pre class=\"\">.\/manage.py makemigrations\r\n.\/manage.py migrate\u00a0--fake-initial<\/pre>\n<p>Falls man ein Custom User Model benutzt, muss man die column `last_login` manuell in der DB \u00e4ndern, ansonsten kommt es zu startup Fehlern.<\/p>\n<pre class=\"\">ALTER TABLE `userprofile_user`\r\nCHANGE COLUMN `last_login` `last_login` DATETIME NULL;<\/pre>\n<h3>Context, Render<\/h3>\n<p>Die Python Class `RequestContext`\u00a0ist nicht mehr vorhanden. Alle imports m\u00fcssen gel\u00f6scht werden.<\/p>\n<pre class=\"\">from django.template.context import RequestContext # l\u00f6schen\r\n<\/pre>\n<p>Anstatt der Class `RequestContext()` kann man ein einfach ein dict() verwenden f\u00fcr den context<\/p>\n<pre class=\"\">context = {}<\/pre>\n<p>die imports, statements mit<\/p>\n<pre class=\"\">from django.shortcuts import render_to_response # alt\r\n...\r\n\r\n    return render_to_response(\"appname\/detail.html\", context) #\u00a0alt<\/pre>\n<p>m\u00fcssen ersetzt werden mit<\/p>\n<pre class=\"\">from django.shortcuts import render #\u00a0neu\r\n...\r\n    return render(request, \"appname\/detail.html\", context) # neu<\/pre>\n<h3>Named urls<\/h3>\n<p>Dies ist nicht zwingend n\u00f6tig, aber bei diesem upgrade empfehle ich auch gerade auf named urls umzustellen. z.B.<\/p>\n<pre class=\"\">... \r\nurl(r'^logout\/$', logout), # alt<\/pre>\n<p>auf<\/p>\n<pre class=\"\">...\r\nurl(r'^logout\/$', logout, name=\"userprofile.views.logout\"),<\/pre>\n<p>string views habe ich alle in callables ge\u00e4ndert z.b.<\/p>\n<pre class=\"\">urlpatterns += static(settings.STATIC_URL, view='django.contrib.staticfiles.views.serve', show_indexes=True) #\u00a0alt\r\n\r\nfrom django.contrib.staticfiles import views as staticfiles_views # neu\r\nurlpatterns += static(settings.STATIC_URL, view=staticfiles_views.serve, show_indexes=True) #\u00a0neu<\/pre>\n<p>&nbsp;<\/p>\n<h3>andere apps<\/h3>\n<p>Wenn man noch andere django apps benutzt kann es zum Teil schwierig sein diese zu migrieren:<\/p>\n<ul>\n<li>manchmal gibt es auch keine neuere Version, und man muss die django app ersetzten<\/li>\n<li>die Datenstruktur l\u00e4sst sich nicht migrieren, manuelle Anpassungen k\u00f6nnen n\u00f6tig sein<\/li>\n<\/ul>\n<p>in diesem Projekt habe ich z.B.<\/p>\n<ul>\n<li>`django-mediagenerator` durch `django-compressor` ersetzt<\/li>\n<\/ul>\n<p>Reine Python packages lassen sich in der Regel einfach updaten.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hier eine Zusammenfassung einiger Upgradeschritte die n\u00f6tigen waren um ein django 1.6 Projekt auf django 1.11 upzugraden. Migrations In django 1.6 wurde in der Regel django south f\u00fcr Datenbankmigrationen benutzt seit Version 1.7 besitzt django selber\u00a0Datenbankmigrationen. Als erstes muss man alle eigenen south migrationen l\u00f6schen z.B. mit find . -type file|grep \/migrations\/ | xargs rm<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,204],"tags":[],"class_list":["post-1271","post","type-post","status-publish","format-standard","hentry","category-django","category-python"],"_links":{"self":[{"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/posts\/1271","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/comments?post=1271"}],"version-history":[{"count":10,"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/posts\/1271\/revisions"}],"predecessor-version":[{"id":1281,"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/posts\/1271\/revisions\/1281"}],"wp:attachment":[{"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/media?parent=1271"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/categories?post=1271"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.taywa.ch\/blog\/wp-json\/wp\/v2\/tags?post=1271"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}