这一篇教程,我们一起来学习Django2中模型的使用。
提示:为了更顺利的学习新的内容,建议大家在PyCharm中重新创建项目和应用。
在之前的教程中,我们已经知道模型(Model)是和数据库相关的。
Django支持多种数据库,包括默认的SQLite3以及MySQL和PostgreSQL等数据库。
使用哪一种数据库需要在项目的settings.py中进行进行配置。
如果使用默认的SQLite3数据库,这个配置是Django创建项目时已经添加好的。
示例代码:
DATABASES = { # 数据库配置 'default': { # 默认数据库 'ENGINE': 'django.db.backends.sqlite3', # 数据库引擎设置 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # 数据库的路径与名称 } }
注意检查一下项目文件夹中是否包含“db.sqlite3”这个数据库文件。
如果没有的话,可以通过PyCharm进行添加。
在项目文件夹上点击鼠标右键,菜单中选择新建(New)-数据源(Data Source),此时会弹出一个窗口。
在这个窗口中,我们可以选择数据库文件的存放路径(Path),直接填写名称即是存放在当前项目文件夹中。
数据库驱动(Driver)选择sqlite(Xerial),然后点击确定(OK)按钮。
在新打开的窗口中,我们可以点击测试链接(Test Connection)测试一下数据库链接是否正常。
点击确定(OK)按钮后,数据库文件就创建好了。
接下来,我们编写模型文件(models.py)的代码。
这里值得一提的是,在更换数据库时,“models.py”中的代码不用做任何更改,只需要在“settings.py”文件中更改数据库的配置。
我们来看一下创建数据库表的流程,就知道为什么这么说了。
创建数据表的流程一共3步:
- 模型文件(models.py)中编写数据表所对应的类;
- 通过“manage.py”的“makemigrations”命令创建迁移项;
- 通过“manage.py”的“migrate”命令创进行迁移。
也就是说,我们在模型文件(models.py)中创建了数据表对应的类,剩下的工作都通过“manage.py”的命令,让Django自动去执行。
一、编写模型文件(models.py)
假设我们创建一个商品信息表。
模型文件(models.py)中,需要创建类以及类的特性(变量),实际上类名对应的是数据库的表名,而特性(变量)对应的是数据表的列(字段)。
示例代码:
class Goods(models.Model): goods_name = models.CharField(max_length=30) goods_number = models.IntegerField() goods_price = models.FloatField()
在上方代码中,我们创建了一些不同类型的字段的对象,包括字符串类型(CharField)、整数类型(IntegerField)和浮点数类型(FloatField)。
字段类型有很多种,例如还有邮箱类型、URL类型等等,大家可以参考官方文档进行使用。
http://www.opython.com/files/docs/django2/ref/models/fields.html
并且,大家能够看到,我们在创建字段对象时还可以输入参数,这些参数在上方文档中也有详尽的描述。
比较常见的参数有几种:
- max_length:该字段最大字符数量限制。
- null :如果为True,则该字段默认为null值。
- blank :如果为True,则该字段可以为空值。
- default :该字段的默认值。
- primary_key :该字段设置为主键。
- unique:该字段的值必须是当前数据列中唯一的。
- choices:该字段的值为二元数组或列表,例如:((1,2),(a,b))。
当我们编写完模型文件(models.py),接下来就可以进行数据迁移,将模型文件(models.py)中的数据迁移到数据库。
二、创建迁移项与执行迁移操作
在创建迁移项之前,我们需要先在全局配置文件(settings.py)中,将当前应用添加到“INSTALLED_APPS”列表。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'MySite.apps.MysiteConfig', # 添加此项 # 'MySite' # 也可以直接添加应用名称 ]
然后,在命令行终端中,通过命令创建迁移项。
python manage.py makemigrations
或者,我们在PyCharm的工具(Tools)中,运行“manage.py”的任务(Run manage.py Task),然后输入命令创建迁移项。
创建迁移项完毕后,会在项目文件夹下的“migrations”文件夹中出现迁移项文件,类似“0001_initial.py”。
接下来,我们再通过“migrate”命令进行数据迁移操作。
python manage.py migrate
或者,在“manage.py”的任务终端中,执行“migrate”命令。
这个命令会将模型文件(models.py)中的数据同步到数据库,完成数据表的创建。
执行的命令与结果:
当我们完成以上步骤,在数据库中就会出现一个名为“MySite_goods”(应用名称_小写类名)的数据表。
不过,在创建数据表的时候,我们可能会遇到这两种情况:
- “models.py”模块中的类遗漏了某个字段或者某个字段觉得没有用了;
- “models.py”模块中,类的某个字段写错了类型或者参数。
当发生这样的情况,创建的数据表就不符合要求,而不能正常使用,我们必须修改表的结构,或者更改字段的设置。
那么,如何解决呢?
在Django1.7版本之前,我们需要借助第三方库“South”进行表结构或者字段的修改操作。
而在Django1.7版本开始,“South”已经集成在“Django.core”中。
我们只需要修改“models.py”模块中类的内容,然后再次运行“makemigrations”和“migrate”命令就能够完成修改。
不过要注意的是,如果更改表结构时,是为数据表添加新的字段,在执行“makemigrations”命令时,需要选择一个选项,并输入该字段的默认值。
如果不想在运行命令时这么麻烦,不妨在“models.py”模块中添加新的字段时,直接写入默认值。
例如商品销量字段:
goods_sales = models.IntegerField(default=0)
当我们完成数据表的创建,我们可以尝试进行数据的添加与读取。
大家还记得之前我们学习的SQL语句吗?
相信有很多人都已经记不清了吧!
别担心,我就是想吓你们一跳,喔嚯嚯嚯嚯嚯嚯嚯嚯嚯!
使用Django可以不用SQL语句,就能够实现数据库的增删改查。
不管执行什么数据操作,我们都需要先导入模型文件(models.py)中的类。
在命令行终端我们导入Goods类。
>>>from MySite.models import Goods
然后,通过类进行数据操作。
一、添加数据
添加数据有两种方式,我们分别演示。
第一种:通过create()方法添加。
>>>Goods.objects.create(goods_name='铅笔',goods_number='10',goods_price='1.5') <Goods: Goods object (1)>
第二种:通过save()方法添加。
>>>g=Goods(goods_name='橡皮',goods_number='20',goods_price='0.5') g.save()
或者使用另外一种写入参数的方式。
>>>g=Goods() >>>g.goods_name='直尺' >>>g.goods_number=15 >>>g.goods_price=2.4 >>>g.save()
二、查询数据
查询数据我们可以使用下列语句。
>>>Goods.objects.all() <QuerySet [<Goods: Goods object (1)>, <Goods: Goods object (2)>, <Goods: Goods object (3)>]>
通过all()方法,能够获取数据库中所有的数据对象。
那么,能不能看到数据的值呢?
通过values()方法,就能够看到数据库中所有数据的值。
>>>Goods.objects.values() <QuerySet [{'id': 1, 'goods_name': '铅笔', 'goods_number': 10, 'goods_price': 1.5}, {'id': 2, 'goods_name': '橡皮', 'goods_number': 20, 'goods_price': 0.5}, {'id': 3, 'goods_name': '直尺', 'goods_number': 15, 'goods_price': 2.4}]>
关于数据库的操作,我们到此先告一段落,在下一篇教程中,我们结合URL分发、视图和模板,在浏览器的页面中进行一些对数据的操作。
转载请注明:魔力Python » Django2:Web项目开发入门笔记(7)