注: 由于自己排版确实很难看,本文开始使用markdown编辑,希望有所改善

官方定义

A model is the single, definitive source of information about your data. It contains the essential fields and behaviors of the data you’re storing. Generally, each model maps to a single database table.

一个模型是关于你的数据的单个的、确定的信息源。它包含了你储存数据的必要的列和行为,基本上,一个模型映射一个单个的数据库表。

更改Django数据库配置

由于原生的django使用的是sqlite3, 本人熟悉mysql 所以最后使用mysql。

注:本文接着上一篇文章来的,如果没有相应的项目请按照上一篇内容操作一下。[Python Django 学习 (一) 【Django 框架初探】]

  • 在 test_project项目中找到文件 test_project/test_project/settings.py 找到如下代码
  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.sqlite3',
  4. 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  5. }
  6. }
  • 将上述代码注释掉,添加如下代码:
  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'NAME': 'mysql',#数据库名字
  5. 'USER':'root',
  6. 'PASSWORD':'*****',
  7. 'HOST':'localhost',
  8. 'PORT':'3306',
  9. }
  10. }
  • 确保一件事情,你的python3 的版本安装了 pymysql 、mysqlclient 使用pip 安装
  1. pip3.6 install pymysql
  2. pip3.6 install mysqlclient
  3. # 我在安装mysqlclient时出现了问题,到 https://www.lfd.uci.edu找的包自己安装的

创建 test_app

在使用model时,官方文档说,“当你定了模型之后,你需要告诉Django你将使用这些模型。通过编辑setting.py中 INSTALL_APPS,将包含你的模型的app的名字放到里面”

  • 打开 CMD 键入 如下指令:
  1. python36 manage.py startapp test_app
  • 将会在 test_project项目下 新建一个 test_app文件目录

  • 作用说明

文件名 作用
migrations 将模型的更改,形成可执行的PY文件,使用指令迁移到数据库中
_init_.py 标识当前文件路径是一个python包
admin.py 可以在其中添加当前model,然后使用界面对数据库进行操作
apps.py 当前app 配置
models.py 存放当前app存在的模型,与数据库一一对应
tests.py 存放当前app的测试
views.py 存在当前app的页面模板
  • 将 test_app 添加到 test_project/test_project/settings.py文件中,如下:
  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. # new add
  9. 'test_app',
  10. ]

添加 testmodel 到 test_app中、迁移到数据库

  • 打开 文件 test_project/test_app/modes.py 更改代码如下:
  1. from django.db import models
  2. # Create your models here.
  3. class TestModel(models.Model):
  4. # django 有一个机制 在没有设置自增主键的时候会自动创建一个主键,
  5. test_name = models.CharField(max_length=100, default='no_name') # 字符类型的字段 设置最大长度与默认值
  6. test_content = models.CharField(max_length=50,default='male') # 字符类型的字段 设置最大长度与默认值
  7. # 如果不指定表名,django默认表明是 'appname_classname'
  8. class Meta:
  9. '''
  10. 使用如下语句定义表名
  11. db_table = 'test_model'
  12. '''
  13. def __unicode__(self):
  14. return '%d: %s' % (self.pk, self.test_name)
  • 打开 CMD 键入 如下命令:
  1. python36 manage.py makemigrations #不指定app将迁移全部数据
  2. python36 manage.py makemigrations test_app # 可以选择单个app进行数据迁移
  3. #以上两个都可以,在app多的时候,建议使用下面的单个迁移
  4. #该命令只是生成迁移文件,并没有真正的操作数据库
  5. #######################################################################################
  6. #返回如下结果
  7. Migrations for 'test_app':
  8. test_app\migrations\0001_initial.py
  9. - Create model TestModel
  • 下面我查看文件夹 test_project\test_app\migrations 增加了文件 0001_initial.py,第一次迁移文件名应该都是这个,之后会不同。查看 文件 0001_initial.py 内容如下:
  1. # Generated by Django 2.0 on 2018-11-15 03:00
  2. from django.db import migrations, models
  3. class Migration(migrations.Migration):
  4. initial = True
  5. dependencies = [
  6. ]
  7. operations = [
  8. migrations.CreateModel(
  9. name='TestModel',
  10. fields=[
  11. ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  12. ('test_name', models.CharField(default='no_name', max_length=100)),
  13. ('test_content', models.CharField(default='male', max_length=50)),
  14. ],
  15. ),
  16. ]
  17. # 我们可以看到,钱 Migration类中,定义了新的 模型 TestModel,并且有三个字段 id、test_name、test_content
  • 我每次迁移的时候都会查看,生成的迁移文件,确保都是我想要的数据库改动。打开CMD 键入指令:
  1. python36 manage.py migrate
  2. #该指令将,真正将建表操作到mysql数据库中
  3. #######################################################################################
  4. #会看到如下提示
  5. Operations to perform:
  6. Apply all migrations: admin, auth, contenttypes, sessions, test_app
  7. Running migrations:
  8. Applying test_app.0001_initial... OK
  9. #可以发现执行了 刚才的 0001_initial.py 文件中的内容
  • 我们打开mysql 数据库查看,是否存在表
  1. mysql> show create table test_app_testmodel
  2. -> ;
  3. +--------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  4. | Table | Create Table |
  5. +--------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  6. | test_app_testmodel | CREATE TABLE `test_app_testmodel` (
  7. `id` int(11) NOT NULL AUTO_INCREMENT,
  8. `test_name` varchar(100) NOT NULL,
  9. `test_content` varchar(50) NOT NULL,
  10. PRIMARY KEY (`id`)
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
  12. +--------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  13. 1 row in set (0.01 sec)
  • 至此,模型与数据库已经实现了同步。

使用 django admin管理数据库数据

  • 之前说过 test_app下的文件 admin.py 添加如下内容:
  1. from django.contrib import admin
  2. from .models import TestModel
  3. # Register your models here.
  4. @admin.register(TestModel)
  5. class TestModelAdmin(admin.ModelAdmin):
  6. list_display = ('pk', 'test_name') #在后台列表下显示的字段
  • 进入 django admin页面 输入超级用户用户名、密码

  • 通过 admin 管理 test model,点击上面的 Test models 可以通过页面进行增、删、改、查的操作

介绍一下Django提供的字段类型

  • 基本类型
  1. AutoField #自增列,如果不存在的话会添加一个自增的ID列
  2. BigAutoField # 64位的,比上面自增列大
  3. BigIntegerField #64 位的整型
  4. BinaryField #原生的二进制列
  5. BooleanField#布尔
  6. CharField#字符串,注意该字段必须指定 max_length
  7. DateField#日期,可以指定auto_now 与 auto_now_add可以自动填充当前列为当前时间
  8. DateTimeField# datetime
  9. DecimalField# 小数点
  10. DurationField# 与python的timedelta对应
  11. EmailField
  12. FileField
  13. FileField and FieldFile
  14. FilePathField
  15. FloatField
  16. ImageField
  17. IntegerField
  18. GenericIPAddressField
  19. NullBooleanField
  20. PositiveIntegerField
  21. PositiveSmallIntegerField
  22. SlugField
  23. SmallIntegerField
  24. TextField
  25. TimeField
  26. URLField
  27. UUIDField
  28. # 不是所有的 field 都用过,有兴趣请自行尝试
  • ArrayField

最近使用 Postgresql 开发,发现它支持,array类型。在Django,中同样支持,代码如下:


  1. class TestModel(models.Model):
  2. test_array = ArrayField(models.CharField(max_length=96, null=False, default=''), default="{}", size="99")
  3. # 意思为增加一个 test_array数组字段,并且数组元素都是char ,可以更换成其他类型
  4. #此处default {}是因为 postgresql在检测的时候强制插入数据为 '{a,b,c,d}',default空的话会报错
  5. class Meta:
  6. db_table = 'test_model'
  7. def __str__(self):
  8. return self.node

代码中的增删改查

  • 分别在以下文件中添加如下代码,路由具体说明将会重新写一篇文章

  1. # test_project/test_project/urls.py
  2. from django.conf.urls import url
  3. from django.contrib import admin
  4. from django.urls import path,include
  5. urlpatterns = [
  6. url(r'^admin/', admin.site.urls),
  7. path('', include('test_app.urls')),#包括test_appurl
  8. ]
  1. #创建 test_project/test_app/urls.py
  2. from django.conf.urls import url
  3. from test_app import views
  4. urlpatterns = [
  5. url('test_app/test_model', views.test_model),
  6. ]
  1. # 需要定义一个查询的api
  2. # test_project/test_app/views.py
  3. from django.shortcuts import render
  4. from django.http import HttpResponse
  5. from . import models
  6. import json as json
  7. from django.core import serializers
  8. def test_model(request):
  9. data = models.TestModel.objects.all()
  10. data_json = json.loads(serializers.serialize('json', data))#将queryset变成json输出
  11. print(str(data_json))
  12. return HttpResponse(data_json);
  13. #启动Django服务后,在浏览器中输入 localhost:8000/test_app/test_model
  14. #打印结果将在cmd显示
  1. # 更换不同的查询方式,打印输出结果
  2. # 数据库中插入了两条数据
  3. models.TestModel.objects.all() #获取所有的数据 返回queryset
  4. models.TestModel.objects.all().values('test_name') #只取test_name列 返回queryset
  5. models.TestModel.objects.get("id=1") #只要id=1 返回object
  6. models.TestModel.objects.all().filter("id=2") #只要id=2 返回queryset
  7. models.TestModel.objects.all().exclude("id=2") #排除id=2 返回queryset
  8. #打印结果
  9. *******
  10. [{'model': 'test_app.testmodel', 'pk': 1, 'fields': {'test_name': 'name1', 'test_content': 'content1'}}, {'model': 'test_app.testmodel', 'pk': 2, 'fields': {'test_name': 'test2', 'test_content': 'content2'}}]
  11. *******
  12. <QuerySet [{'test_name': 'name1'}, {'test_name': 'test2'}]>
  13. *******
  14. TestModel object (1)
  15. *******
  16. [{'model': 'test_app.testmodel', 'pk': 2, 'fields': {'test_name': 'test2', 'test_content': 'content2'}}]
  17. *******
  18. <QuerySet [<TestModel: TestModel object (1)>]>
  19. *******
  20. #更细节的查询,官网查看吧
  21. https://docs.djangoproject.com/en/2.0/topics/db/queries/
  1. #更改 test_project/test_app/urls.py,添加对于增加数据的url配置
  2. from django.conf.urls import url
  3. from test_app import views
  4. urlpatterns = [
  5. url('test_app/test_model', views.test_model),
  6. # new add
  7. url('test_app/test_addto_model', views.add_test_model),
  8. ]
  1. #更改 test_project/test_app/views.py 新增如下函数代码
  2. def add_test_model(request):
  3. models.TestModel.objects.create(
  4. test_name="name_add_by_code",test_content="content_add")
  5. new_data = models.TestModel.objects.all()
  6. new_data_json = json.loads(serializers.serialize('json', new_data))
  7. return HttpResponse(new_data_json);
  8. #启动 django 服务后,访问链接 localhost:8000/test_app/test_addto_model
  1. 页面输入结果:
  2. {'model': 'test_app.testmodel', 'pk': 1, 'fields': {'test_name': 'name1', 'test_content': 'content1'}}{'model': 'test_app.testmodel', 'pk': 2, 'fields': {'test_name': 'test2', 'test_content': 'content2'}}{'model': 'test_app.testmodel', 'pk': 3, 'fields': {'test_name': 'name_add_by_code', 'test_content': 'content_add'}}
  3. 数据库查询结果
  4. mysql> select * from test_app_testmodel;
  5. +----+------------------+--------------+
  6. | id | test_name | test_content |
  7. +----+------------------+--------------+
  8. | 1 | name1 | content1 |
  9. | 2 | test2 | content2 |
  10. | 3 | name_add_by_code | content_add |
  11. +----+------------------+--------------+
  12. 3 rows in set (0.00 sec)
  13. 增加成功
  1. # 由于考虑到数据完整行,简单介绍一下 Django 的 【事物】
  2. from django.db import transaction
  3. with transaction.atomic():
  4. #数据库操作
  5. #上面是最简单的方法,过程中报错将不会操作数据库
  6. #详情参加官网:https://docs.djangoproject.com/en/2.0/topics/db/transactions/
  1. #不做演示了,直接上代码
  2. models.UserInfo.objects.filter(test_name='nam1').update(test_content='content1_update')
  1. #删除的时候一定要filter一下呦
  2. models.UserInfo.objects.filter(test_name='test2').delete()

数据库结构的导入到代码

  1. 下载了项目代码,但是本地数据库中没有项目表结构
  2. 数据库在后台改动了,要同步到代码中
  1. python36 manage.py inspectdb

注:在使用makemigrations 与 migrate时,每一次的 makemigrations 是基于上一个makemigrations进行比较的,如果某一次的makemigrations后,migrate失败,切记到 app下 migrations文件夹下删除,最新的makemigrations文件,然后修改model代码,重新makemigrations,否则将会报错一直迁移不到数据库中。被这个坑了好久。

Python Django 学习 (二) 【Django 模型】的更多相关文章

  1. Django学习(二) Django框架简单搭建

    为了快速学习Python进行Web的开发,所以我不准备从Python的基础学起,直接从Django框架入手,边学框架边学Python的基础知识. 下面就开始Django的快速开发之旅吧. 关于Djan ...

  2. Django学习之django自带的contentType表 GenericRelation GenericForeignKey

    Django学习之django自带的contentType表   通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/a ...

  3. day 94 Django学习之django自带的contentType表

    Django学习之django自带的contentType表   通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/a ...

  4. day 93 Django学习之django自带的contentType表

    Django学习之django自带的contentType表   通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/a ...

  5. day 91 Django学习之django自带的contentType表

      Django学习之django自带的contentType表   通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net ...

  6. Django学习之django自带的contentType表

    Django学习之django自带的contentType表 通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/aar ...

  7. Python基础学习二

    Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...

  8. Django框架(二) MTV模型简介

    MTV模型 Django的MTV分别代表 Model(模型):和数据库相关的,负责业务对象与数据库的对象(ORM) Template(模板):放所有的html文件 模板语法:目的是将白变量(数据库的内 ...

  9. django学习-10.django连接mysql数据库和创建数据表

    1.django模型 Django对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle. Django为这些数据库提供了统一的调用API. 我们可以根据自己 ...

  10. Django学习(一) Django安装配置

    上一节介绍了如何搭建Python的开发环境,这次介绍一下如何搭建Django的开发环境. 第一.下载Django Django跟Python的版本对应 Django version Python ve ...

随机推荐

  1. BSGS算法及其扩展

    bsgs算法: 我们在逆元里曾经讲到过如何用殴几里得求一个同余方程的整数解.而\(bsgs\)就是用来求一个指数同余方程的最小整数解的:也就是对于\(a^x\equiv b \mod p\) 我们可以 ...

  2. python - logging模块应用

    logging日志模块应用: import logging # logging.basicConfig( # #定义日志级别,共5个级别,默认级别为warning级别,所以debug和info级别不添 ...

  3. slf4j的简单用法以及与log4j的区别

    之前在项目中用的日志记录器都是log4j的日志记录器,可是到了新公司发现都是slf4j,于是想着研究一下slf4j的用法. 注意:每次引入Logger的时候注意引入的jar包,因为有Logger的包太 ...

  4. Django 利用管理器实现文章归档

    Django管理器:class Manager 管理器是Django的模型进行数据库查询的接口,Django应用的每个模型都拥有至少一个管理器.默认情况下,Django为每个模型类添加一个名为obje ...

  5. 【vim】保存文件并退出 :w=:wq

    这两个命令实际上并不完全等价,当文件被修改时两个命令时相同的.但如果未被修改,使用 :x 不会更改文件的修改时间,而使用 :wq 会改变文件的修改时间.

  6. Linux内存管理--基本概念【转】

    转自:http://blog.csdn.net/myarrow/article/details/8624687 1. Linux物理内存三级架构 对于内存管理,Linux采用了与具体体系架构不相关的设 ...

  7. MySQL中adddate学习

    -- 修改时间:ADDDATE(date,INTERVAL expr unit) -- 含义:date时间,expr 表达式值,unit表达式对应的时间单位 -- unit : SECOND,MINU ...

  8. Android:注册登录

    注册登录的实现 先在layout里新建一个xml文件: //login.xml <?xml version="1.0" encoding="utf-8"? ...

  9. 服务器上安装FileZilla Server连接时报You appear to be behind a NAT router. Please configure the passive mode settings and forward a range of ports in your router.

    官方资源下载链接:客户端,或者直接点击下载“FileZilla_3.24.0_win64-setup.exe”:服务端,或者直接点击下载“FileZilla_Server-0_9_60_2.exe”: ...

  10. 13-JS中的面向对象

    创建对象的几种常用方式 1.使用Object或对象字面量创建对象 2.工厂模式创建对象 3.构造函数模式创建对象 4.原型模式创建对象 1.使用Object或对象字面量创建对象 JS中最基本创建对象的 ...