学习动力
我今年的项目主要基于Django开发,学习了很多新东西。我很多时候,担心日后会忘记很多有趣的东西,我想写下笔记。但是从哪个方面入手,我没有思路。所以查看了一些书,根据目录进行总结。希望自己不会错过什么!定义模型
为了简单,我直接编写和官网一样的例子。
from django.db import modelsclass Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30)
我直接使用makemigrations命令的话,我们可以查看myapp里面有个migrates目录。
from __future__ import unicode_literalsfrom django.db import migrations, modelsclass Migration(migrations.Migration): dependencies = [ ] operations = [ migrations.CreateModel( name='Person', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('first_name', models.CharField(max_length=30)), ('last_name', models.CharField(max_length=30)), ], ), ]
从上面的代码可以看出,系统不仅仅给生成first_name,last_name还有id,它的类型是AutoField类,既然学习的是类型的定义,那我现在可以在自己的脑海中留下一个思维图。
好啦!我现在有几个问题:
1)我一定要生成id吗?2)我可以修改CharField的max_length属性,还能修改什么属性?3)migrations.Migration又是一个什么样子的类呢?现在执行migrate然后查看sqlite生成的表格。CREATE TABLE "myapp_person" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "first_name" varchar(30) NOT NULL, "last_name" varchar(30) NOT NULL);
现在又有几个问题:
1)为什么表被命名为myapp_person,我们并没有在哪设置这个名字啊?2)我们能否使用别的域作为主键?3)我们能否自定义表名?答案如下:1),3) 我们来试试看,如何设置Meta类里面的属性,来改变我们的表名。class Person(models.Model): #Rest of code class Meta: db_table = 'new_table'
执行makemigrations我们会在终端得到下面的信息。
查看我们的0002文件,得到如下的内容。from __future__ import unicode_literalsfrom django.db import migrations, modelsclass Migration(migrations.Migration): dependencies = [ ('myapp', '0001_initial'), ] operations = [ migrations.AlterModelTable( name='person', table='new_table', ), ]
从上面生成的代码可以看出,django并不是从新生成数据库的各个域,只是修改名字而已,与我们平时使用sql语句的做法应该是一致的。继续运行migrate我们查看生成的sql语句如下:
CREATE TABLE "new_table" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "first_name" varchar(30) NOT NULL, "last_name" varchar(30) NOT NULL);
的确,是从新改写了表名,我们得到了新的表名,那么如果里面已经存有数据,该表名会删除数据吗?为了,进一步测试,我们先把这个类注册到admin中。
from django.contrib import adminfrom .models import Personadmin.site.register(Person)
记住,别忘记创建管理员账户。创建后就可以在管理员里面增加数据到person类啦。
然后,我们再修改Meta的名字,看看数据是否会被删除。现在,数据为这个。我们试着从新把表名改了(改回系统默认的)class Migration(migrations.Migration): dependencies = [ ('myapp', '0002_auto_20151213_0903'), ] operations = [ migrations.AlterModelTable( name='person', table='myapp_person', ), ]
我们这次,查看到系统是更加第二次修改的记录进行的,我们继续看看我们的数据是否丢失。
数据还在,说明我们的django是会保护我们的数据的,我们可以放心的去做啦。使用模型
总结