-
Notifications
You must be signed in to change notification settings - Fork 1
/
django-17shi-yong.html
205 lines (179 loc) · 12.5 KB
/
django-17shi-yong.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Won" />
<meta name="copyright" content="Won" />
<meta name="keywords" content="Django, It, " />
<title>Django 1.7试用 · Tugqi Biz
</title>
<link href="http://cdn-images.mailchimp.com/embedcode/slim-081711.css" rel="stylesheet" type="text/css">
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="http://wbowam.github.io/theme/css/style.css" media="screen">
<link rel="stylesheet" type="text/css" href="http://wbowam.github.io/theme/css/solarizedlight.css" media="screen">
<link rel="shortcut icon" href="http://wbowam.github.io/theme/images/favicon.ico" type="image/x-icon" />
<link rel="apple-touch-icon" href="http://wbowam.github.io/theme/images/apple-touch-icon.png" />
<link rel="apple-touch-icon" sizes="57x57" href="http://wbowam.github.io/theme/images/apple-touch-icon-57x57.png" />
<link rel="apple-touch-icon" sizes="72x72" href="http://wbowam.github.io/theme/images/apple-touch-icon-72x72.png" />
<link rel="apple-touch-icon" sizes="114x114" href="http://wbowam.github.io/theme/images/apple-touch-icon-114x114.png" />
<link rel="apple-touch-icon" sizes="144x144" href="http://wbowam.github.io/theme/images/apple-touch-icon-144x144.png" />
<link rel="icon" href="http://wbowam.github.io/theme/images/apple-touch-icon-144x144.png" />
</head>
<body>
<div id="content-sans-footer">
<div class="navbar navbar-static-top">
<div class="navbar-inner">
<div class="container">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="http://wbowam.github.io/"><span class=site-name>Tugqi Biz</span></a>
<div class="nav-collapse collapse">
<ul class="nav pull-right top-menu">
<li ><a href="http://wbowam.github.io">Home</a></li>
<li ><a href="http://wbowam.github.io/categories.html">Categories</a></li>
<li ><a href="http://wbowam.github.io/tags.html">Tags</a></li>
<li ><a href="http://wbowam.github.io/archives.html">Archives</a></li>
<li><form class="navbar-search" action="http://wbowam.github.io/search.html" onsubmit="return validateForm(this.elements['q'].value);"> <input type="text" class="search-query" placeholder="Search" name="q" id="tipue_search_input"></form></li>
</ul>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row-fluid">
<div class="span1"></div>
<div class="span10">
<article>
<div class="row-fluid">
<header class="page_header span10">
<h1><a href="http://wbowam.github.io/django-17shi-yong.html"> Django 1.7试用 </a></h1>
</header>
</div>
<div class="row-fluid">
<div class="span10 article-content">
<p>首先感谢django团队,在这一版本里django自身提供了数据迁移功能——migration</p>
<h3 id="_1">数据迁移<a class="headerlink" href="#_1" title="Permanent link">¶</a></h3>
<p>修改Model后可以在不影响现有数据的前提下重建表结构。 </p>
<h6 id="southsouthdjango">以往的解决方案是South(于是South成为了django必备的,最受欢迎的应用。)<a class="headerlink" href="#southsouthdjango" title="Permanent link">¶</a></h6>
<h4 id="_2">原理<a class="headerlink" href="#_2" title="Permanent link">¶</a></h4>
<p>django的migration功能,类似与South的migration功能。 </p>
<h5 id="_3">开始一个新的项目<a class="headerlink" href="#_3" title="Permanent link">¶</a></h5>
<div class="highlight"><pre><span class="n">django</span><span class="o">-</span><span class="n">admin</span><span class="p">.</span><span class="n">py</span> <span class="n">startproject</span> <span class="n">mysite</span>
<span class="cp">## Create the tables in the database before we can use them.</span>
<span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">migrate</span>
<span class="cp">## Create superuser.</span>
<span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">createsuperuser</span>
</pre></div>
<h5 id="app">创建app:<a class="headerlink" href="#app" title="Permanent link">¶</a></h5>
<div class="highlight"><pre><span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">startapp</span> <span class="n">myblog</span>
<span class="cp">##1.7版django这一步时会创建一个migrations/目录</span>
</pre></div>
<div class="highlight"><pre><span class="cp">##settings.py</span>
<span class="n">INSTALLED_APPS</span> <span class="o">=</span><span class="p">(</span>
<span class="err">####</span>
<span class="err">'</span><span class="n">myblog</span><span class="err">'</span><span class="p">,</span>
<span class="p">)</span>
</pre></div>
<div class="highlight"><pre><span class="cp">##models.py</span>
<span class="n">class</span> <span class="n">Article</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span>
<span class="n">title</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">18</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">)</span>
</pre></div>
<h5 id="_4">生成数据表<a class="headerlink" href="#_4" title="Permanent link">¶</a></h5>
<p>(覆盖了syncdb功能,不过别担心,syncdb仍然还有~) </p>
<div class="highlight"><pre><span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">makemigrations</span> <span class="n">myblog</span>
</pre></div>
<p>运行结果如下</p>
<div class="highlight"><pre><span class="n">Migrations</span> <span class="k">for</span> <span class="err">‘</span><span class="n">myblog</span><span class="err">’</span><span class="o">:</span>
<span class="mo">0001</span><span class="n">_initial</span><span class="p">.</span><span class="n">py</span><span class="o">:</span>
<span class="o">-</span> <span class="n">Create</span> <span class="n">model</span> <span class="n">Article</span>
</pre></div>
<p>看看生成了哪些文件</p>
<div class="highlight"><pre><span class="n">ls</span> <span class="n">myblog</span><span class="o">/</span><span class="n">migrations</span><span class="o">/</span>
<span class="n">__init__</span><span class="p">.</span><span class="n">py</span> <span class="mo">0001</span><span class="n">_initial</span><span class="p">.</span><span class="n">py</span>
</pre></div>
<h4 id="modelsauthor">修改models,添加一个author属性<a class="headerlink" href="#modelsauthor" title="Permanent link">¶</a></h4>
<div class="highlight"><pre><span class="n">class</span> <span class="n">Article</span><span class="p">(</span><span class="n">models</span><span class="p">.</span><span class="n">Model</span><span class="p">)</span><span class="o">:</span>
<span class="n">title</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">18</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">)</span>
<span class="n">author</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">OneToOneField</span><span class="p">(</span><span class="n">User</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="n">True</span><span class="p">)</span>
</pre></div>
<h5 id="_5">生成数据表(修改后)<a class="headerlink" href="#_5" title="Permanent link">¶</a></h5>
<div class="highlight"><pre><span class="n">python</span> <span class="n">manage</span><span class="p">.</span><span class="n">py</span> <span class="n">makemigrations</span> <span class="n">myblog</span>
<span class="cp">##运行结果</span>
<span class="n">Migrations</span> <span class="k">for</span> <span class="err">‘</span><span class="n">myblog</span><span class="err">’</span><span class="o">:</span>
<span class="mo">0002</span><span class="n">_article_author</span><span class="p">.</span><span class="n">py</span><span class="o">:</span>
<span class="o">-</span> <span class="n">Add</span> <span class="n">field</span> <span class="n">author</span> <span class="n">to</span> <span class="n">article</span>
</pre></div>
<p>我们来看看他重新生成数据表时干了些什么
<em> 从上一个migration中获取之前的Model列表,写到set中.
</em> 获取现有的model列表,写入set中。
* 遍历这两个set的差集,获取差集Model中所有的field,如果field的定义相同,就询问用户是否是一个rename的model,否则视为创建。</p>
<h4 id="migrate">数据迁移(migrate)<a class="headerlink" href="#migrate" title="Permanent link">¶</a></h4>
<p><code>python manage.py migrate myblog</code> </p>
<hr />
<p>That's all
以上是个人对migration的理解,求纠错和指点~~</p>
<aside>
<hr/>
<nav>
<ul class="articles_timeline">
<li class="previous_article">« <a href="http://wbowam.github.io/django-guo-ji-hua.html" title="Previous: django 国际化">django 国际化</a></li>
<li class="next_article"><a href="http://wbowam.github.io/djangokai-qi-the-sites-framework.html" title="Next: Django开启 the sites framework">Django开启 the sites framework</a> »</li>
</ul>
</nav>
</aside>
<!-- Duoshuo Comment BEGIN -->
<div class="ds-thread" data-author-key="4433755"></div>
<script type="text/javascript">
var duoshuoQuery = {short_name:"tlbog"};
(function() {
var ds = document.createElement('script');
ds.type = 'text/javascript';ds.async = true;
ds.src = 'http://static.duoshuo.com/embed.js';
ds.charset = 'UTF-8';
(document.getElementsByTagName('head')[0]
|| document.getElementsByTagName('body')[0]).appendChild(ds);
})();
</script>
<!-- Duoshuo Comment END -->
</div>
<section>
<div class="span2" style="float:right;font-size:0.9em;">
<h4>Published</h4>
<time pubdate="pubdate" datetime="2014-09-07T00:00:00+08:00">Sep 7, 2014</time>
<h4>Category</h4>
<a class="category-link" href="/categories.html#It-ref">It</a>
<h4>Tags</h4>
<ul class="list-of-tags tags-in-article">
<li><a href="/tags.html#Django-ref">Django
<span>23</span>
</a></li>
</ul>
</div>
</section>
</div>
</article>
</div>
<div class="span1"></div>
</div>
</div>
</div>
<footer>
<div id="footer">
<ul class="footer-content">
<li class="elegant-power">Powered by <a href="http://getpelican.com/" title="Pelican Home Page">Pelican</a>. Theme: <a href="http://oncrashreboot.com/pelican-elegant" title="Theme Elegant Home Page">Elegant</a> by <a href="http://oncrashreboot.com" title="Talha Mansoor Home Page">Talha Mansoor</a></li>
</ul>
</div>
</footer> <script src="http://code.jquery.com/jquery.min.js"></script>
<script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/js/bootstrap.min.js"></script>
<script>
function validateForm(query)
{
return (query.length > 0);
}
</script>
</body>
</html>