博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django定义和使用模型
阅读量:6359 次
发布时间:2019-06-23

本文共 2622 字,大约阅读时间需要 8 分钟。

学习动力

我今年的项目主要基于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是会保护我们的数据的,我们可以放心的去做啦。

使用模型

总结

转载地址:http://qabma.baihongyu.com/

你可能感兴趣的文章
js生成txt文件
查看>>
个人笔记
查看>>
Redis适用于高并发的递增、递减功能
查看>>
Linux 内核 链表 的简单模拟(2)
查看>>
poj 1077 Eight(A*)
查看>>
爬虫-爬取豆瓣图书TOP250
查看>>
<T extends Serializable>这是什么意思呢?看明白这个,你的问题就自然而然的明白了!...
查看>>
linux系统的安装使用经验
查看>>
Excel2010如何合并列数据
查看>>
程序注释
查看>>
uoj#290. 【ZJOI2017】仙人掌(数数+仙人掌+树形dp)
查看>>
ng-route使用笔记
查看>>
2018-8-8面试准备
查看>>
ActiveXObject 安装
查看>>
MongoDB教程
查看>>
解决获取IP地址时出现“在一个非套…
查看>>
osx的终端软件iterm2 之 修改外观 和 常用快捷键小结
查看>>
Android自动化测试01-环境安装连接问题及解决
查看>>
九度 题目1523:从上往下打印二叉树 题目1521:二叉树的镜像
查看>>
ZOJ - 3703 Happy Programming Contest
查看>>