- MTV编程模式
- 好处
降低了各个功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用
- Models(模型)
1.是应用程序中用于处理应用程序数据逻辑的部分
2.通常模型对象负责在数据库中存储数
- Template(模板)
1.是应用程序中处理显示的部分
2.通常视图是依据模型数据创建的
- Views(视图)
1.是应用程序中处理用户交互的部分
2.通常控制器负责从视图中读取数据,控制用户输入,并向模型发送数据
- 创建项目
- 在合适的位置创建一个目录
- cmd到目录下创建项目 django-admin start
输入代码:
django-admin start <project>
- 关于目录层级的说明
查看目录层级的命令:tree . /f
D:\Python-Django\Second-Project>tree . /f
卷 娱乐 的文件夹 PATH 列表
卷序列号为 362D-5881
D:\PYTHON-DJANGO\SECOND-PROJECT
└─project
│ manage.py 一个命令行工具,可以使我们用多种方式对django项目进行交互
│
└─project
settings.py 项目的配置文件
urls.py URL管理器,使项目的URL声明
wsgi.py 项目于WSGI兼容的Web服务器入口
__init__.py 一个空文件,它告诉python这个目录应该被看作一个python包
- 基本操作
<1>设计表结构
- 表的设计
【表名】:grade
【字段】:
班级名称
<2>配置数据库
- 启动MySQL服务**
以管理员身份启动cmd,并且在输入net start mysql
- django默认使用sqlite数据库,在settings.py文件中,通过DATEBASES选项进行数据库配置
- 配置MySQL**
1.python安装pymysql
2.在__init__.py文件中写入代码:
import pymysql
pymysql.install_as_MySQLdb()
3.创建一个新的数据库
mysql> create database new;
Query OK, 1 row affected (0.00 sec)
4.在setting.py文件中配置数据库文件
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'new',
'USER':'root',
'PASSWORD':'******',
'HOST':'localho0st',#服务器
'PORT':3306,#端口
}
}
5.
<3>创建应用
在一个项目中可以创建多个应用,每个应用进行一种业务处理
同样的,一个应用也可以被多个项目所用
- 一个项目中可以创建多个应用,一个应用也可以被多个项目所用
- cmd进入创建的项目中去
- D:\Python-Django\project>python manage.py startapp MyApp
会创建一个统计的文件夹,这就是新创建的APP
- MyApp说明
Admin 站点配置
Models 模型
Views 视图
- 激活App;#将应用配置到项目中**
###将应用配置到项目中
在setting.py文件中将MyApp应用加入到INSTALLED_APPS中
<4>定义模型
- 一个数据表就对应一个模型
- 在MyApp文件下的models.py文件中定义模型,使其能与数据库进行交互
- 模型类型要继承models.Model类
from django.db import models
- 创建模型类**
1.定义一个类,类对应数据库中一张表
2.类中的属性,对应着数据库表中的字段
class Grade(models.Model):
gname = models.CharFiled(max_length=20)
gdate = models.DateTimeFiled()
ggirlnum = models.IntegerField()
gboynum = models.IntegerField()
isDelete = models.BooleanFiled()
class Students(models.Model):
sname = models.CharFiled(max_length=20)
sgender = models.BooleanFiled(default=True)
sage = models.IntegerField()
scontend = models.CharFiled(max_length=20)
isDelete = models.BooleanFiled(default=False)
#关联外键
sgrade = models.ForeignKey('Grade', on_delete = models.CASCADE)
#此处不需要定义主键,在生成时自动添加,并且值为自动添加
#也就是说可以直接关联外键就行
- 在数据库中生成数据表
<1>生成迁移文件
在项目的文件夹下执行命令:
<python manage.py makemigrations>
在migrations目录下生成员工迁移文件,但是在数据库中还没有生成员工数据表
伪代码:
D:\Python-Django\Second-Project\project>python manage.py makemigrations
Migrations for 'Baby1':
Baby1\migrations\0001_initial.py
- Create model Class
- Create model Students
- 在project目录下cmd执行:python manage.py makemigrations
作用:
在migrations目录下生成一个迁移文件,此时数据库中还没有表生成
D:\Python-Django\project>python manage.py makemigrations
Migrations for 'MyApp':
MyApp\migrations\0001_initial.py
- Create model Grade
- Create model Students
<2>执行迁移
在项目下执行迁移命令:
python manage.py migrate
相当于执行sql语句创建了数据表
伪代码:
D:\Python-Django\Second-Project\project>python manage.py migrate
Operations to perform:
Apply all migrations: Baby1, admin, auth, contenttypes, sessions
Running migrations:
Applying Baby1.0001_initial... OK
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying sessions.0001_initial... OK
- python manage.py migrate
D:\Python-Django\project>python manage.py migrate
Operations to perform:
Apply all migrations: MyApp, admin, auth, contenttypes, sessions
Running migrations:
Applying MyApp.0001_initial... OK
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying sessions.0001_initial... OK
- 从数据库中验证
SELECT * FROM `myapp_grade`
id gname gdate ggirlnum gboynum isDelete
------ ------ ------ -------- ------- ----------
- 测试数据操作
- 执行 python manage.py shell
D:\Python-Django\project>python manage.py shell
Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
- 引入包
>>> from MyApp.models import Grades,Students
>>> from django.utils import timezone
>>> from datetime import *
>>>
- 查询所有数据
1.类名.objects.all()
>>> Grade.objects.all()
<QuerySet []>
- 添加数据:添加一个模型类的对象实例***
实质:添加一个模型类的对象实例
伪代码:
>>> from MyApp.models import Grade,Students
>>> from django.utils import timezone
>>> from datetime import *
>>> Grade.objects.all()
<QuerySet []>
>>> grade = Grade()
#相当于创建一个空的字段
>>> grade.gname = 'one'
>>> grade.save()
django.db.utils.IntegrityError: (1048, "Column 'gdate' cannot be null")
#必须有save()才能存储在数据库中
#可以看出必须一次性的把表填满才行
#对于值有default的可以不填,按默认值来
>>> grade.gdate = datetime(year = 2019,month=5,day=15)
>>> grade.ggirlnum = 11
>>> grade.gboynum = 17
>>> grade.isDelete=False
>>> grade.save()
MySQL验证结果:
id gname gdate ggirlnum gboynum isDelete
------ ------ ------------------- -------- ------- ----------
1 one 2019-05-15 00:00:00 11 17 0
python验证结果:
>>> Grade.objects.all()
<QuerySet [<Grade: Grade object (1)>]>
- 查看某个对象:类名.objects.get(pk=1)**
>>> Grade.objects.get(pk=1)
<Grade: Grade object (1)>
#查询id=1的
>>> print(grade.gboynum)
17
#自己琢磨的,管用来
- 通过模型修改数据:<模型对象.属性 = 新值>**
>>> print(grade.gboynum)
17
>>> grade.gboynum = 10
>>> grade.save()
>>> print(grade.gboynum)
10
- 删除数据:模型对象.delete()**
grade.delete()
#物理删除,不用save就删除了
- 关联对象
>>> from MyApp.models import Grade,Students
>>> from django.utils import timezone
>>> from datetime import *
>>> stu = Students()
>>> stu.sname = '于海洋'
>>> stu.sage = 19
>>> stu.scontend = 'Yo Bro!'
>>> stu.sgrade=Grade.objects.get(pk=1)
#对学生引用外键
验证:
>>> Students.objects.all()
<QuerySet []>
>>> stu.save()
>>> Students.objects.all()
<QuerySet [<Students: Students object (1)>]>
- 获得关联对象的集合:关联的对象小写_set.all() <难理解>
>>> from MyApp.models import Grade,Students
>>> from django.utils import timezone
>>> from datetime import *
>>> grade = Grade.objects.get(pk=1)
>>> print(grade)
>>> grade.students_set.all()
<QuerySet [<Students: Students object (1)>]>
- 启动服务器
- 格式
python manage.py runserver ip:port
ip可以不写,默认为本机的ip;端口号默认为8000
python manage.py runserver
- 说明
这是一个轻量级的纯python开发的web服务器,并且仅仅在开发时使用
- Admin站点管理
- 概述
用于:
内容发布:负责开发,修改,删除内容
- 配置Admin应用
- 创建管理员用户**
D:\Python-Django\project>python manage.py createsuperuser
Username: Soul
Email address: 1252106073@qq.com
Password:
Password (again):
Superuser created successfully.
- 汉化
在setting.py文件夹中进行如下的修改
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
- 管理数据表 之 修改<MyApp中的admin.py文件>
修改MyApp中的admin.py文件
from .models import Grade,Students
#进行注册
admin.site.register(Grade)
admin.site.register(Students)
不行,我实在忍不住吐槽两句
今天效率有点高啊。
还有两马的对话 https://baijiahao.baidu.com/s?id=1643180098978511698&wfr=spider&for=pc
不了解AI真的不知道它的不可控性是多么的大,就算你训练出来了AlphaGo,能打败全人类,但是训练出来它的工程师也不知道它真正是如何做到的,你只知道它能做,但是不知道它为什么能做,内部复杂的神经网络将成千上万乃至上亿的参数链接在一块,它思考出来什么都是有可能的。
现在的AI只是在针对某一特定的方向进行训练,比如,训练视觉的只是在训练视觉,训练语音识别的只会识别语音,AlphaGo只会下围棋…一方面是算力还不够,没有足够强大的计算机,但说到底还是算法的问题,machine learning让AI有了长足的进步,出足了风头,但是差不多也就这样了,现在只是将技术铺开来,进行运用阶段。并没有更新更好更具有革命性的算法出现,能够使得它更上一层楼。
过个几十年或者十几年,新的算法出现的时候,那就是一个新的天地了,世界会是什么样的呢?我又是以一个什么样的身份,什么样的角度,什么样的态度看待它呢?
我会去阻止它还是祝它一臂之力?未来真让人期待呀!
饿了,吃饭,上电路。
- 进阶之利用装饰器进行注册
@admin.register(Grade)
@admin.register(Students)
- 管理数据表 之 修改<自定义管理页面>**
class GradeAdmin(admin.ModelAdmin):
#列表页属性
1. list_display = [<显示字段>]
伪代码:
list_display = ['pk','gboynum','ggirlnum','gdate','isDelete']
2.list_filter = []
过滤字段:
list_filter = ['gname']
3.search_fields = []
查找字段
4.list_per_page = []
#添加,修改页属性
fields = []
fieldsets = []
- 视图的基本操作
<1>概述
- 在django中视图对web请求进行回应,有几个页面就有几个函数
- 视图就是一个python的函数,在views.py文件中进行定义
<2>定义视图**
代码:
from django.http import HttpResponse
def index(requests):
return HttpResponse('GoodMan')
<3>配置URL
- 修改project文件下的url.py
from django.contrib import admin
from django.urls import path
###from django.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
###path('index/',include('MyApp.urls'))
]
- 在MyApp文件下创建一个urls.py文件
from django.conf.urls import url
from . import views
urlpatterns = [
url('',views.index)
]
-
所以说新引进来的URL的地址就是两个地址相加得到的http://127.0.0.1:8000/index/
-
访问该URL得到的反馈就是通过第一个url跳转到第二个url文件进而得到了views下面的一个名为index的函数
<4>关于URL配置的案例
1.因为想要让/index/还是做前缀,所以不用去改变project目录下的URL文件了
2.改变MyApp下的url文件:
urlpatterns = [
url('re',views.index),
url(r'^(\d+)/$',views.number),
#在urlpartterns中添加一个url地址,该地址匹配一个含有数字和/组成的字符串
#数字用()括起来可以实现取值,但是注意这里取到的值式字符形式的数字
]
3.在views中添加一个函数,实现该url的功能
def number(requests,num):
return HttpResponse('The Result is %s'%num)
#可以看出参数表中还是要填写requests,不过因为又取了一个nun,所以要多一个参数
#同时可以看出获得的num的type的确式字符的形式,如果使用%d的形式进行填充那么就会出错
#如果想要把从url中获得的东西进行使用,那么需要对类型进行转换
- 模板的基本使用
<1>概述
- 模板是HTML页面,可以根据视图中传递的数据进行填充
<2>创建模板
- 在project目录下创建模板python packge
- 在新创建的templates包中创建一个名为MyApp的python包,用于存储所有属于MyApp模板的
<3>配置模板路径
- 在settings.py文件中就该TEMPLATES文件
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
#将文件路径添加到DIRS中
'DIRS': [os.path.join(BASE_DIR,'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
<4>定义Grade.HTML模板
- 在templates下的MyApp中创建一个Grade.html文件
- 设计HTML页面
- 模板语法1: {{输出值,可以是变量也可以是对象属性}}
<h1>班级信息列表</h1>
<ul>
{% for grade in grades %}
<li>
<a href="#">{{ grade.gname }}</a>
</li>
{% endfor %}
</ul>
- 模板语法2: {%执行代码段%}
<h1>班级信息列表</h1>
<ul>
{% for grade in grades %}
<li>
<a href="#">{{ grade.gname }}</a>
</li>
{% endfor %}
</ul>
<5>模板使用的完美过程(1)***
项目概述:
我想要再MyApp下有一个页面能够实现的功能是显示数据库中Grade中的数据
1.定义URL,想让它的URL为http://127.0.0.1:8000/index/grade/
因此project目录下的URL就不用进行修改,接着使用
path('index/',include('MyApp.urls'))
再MyApp下的url文件下添加一条即可
url(r'^grade/$',views.grade)
2.定义视图
再MyApp文件下的views下创建一个名为grade的函数,我们想要该函数实现两个功能
<1>从数据库中提取数据
from .models import Grade
#首先得调用模板,让模型与数据库打交道,获取数据库中的数据,然后拿给视图进行下一步的筛选等操作
def grade(requests):
gradelist = Grade.objects.all()
#这一步实现的功能是去模型里取出想要的数据
<2>将数据传递给模板
return render(requests,'MyApp/grade.html',{'grades':gradelist})
#因为我们再settings.py文件中已经写好了BASE_DIR,所以后面传递直接写templates内部的路径就好了
#可以看出最后传递给的是一个HTML文件,这个HTML文件也就是我们的模板
#最后一个返回的参数是一个字典的形式,前一个表示的是在模板中参数的名称,后一个表示的是在当前的视图中变量的名称
#注意字典中前一个是字符串的形式,这是可以理解的,因为整个的HTML页面中全都是字符串形式的
3.对模板的设计和操作
在templates中的MyApp文件下新建一个名为Grade 的HTML文件,这就是我们的模板了
该模板主要想要实现的功能是--显示从数据库中拿来的Grade表的文件
表的设计:
<h1>班级信息列表</h1>
#设置一个标题
<ul>
#设置一个有序列表
{% for grade in grades %}
#利用循环的方式从表中提取数据
<li>
<a href="#">{{ grade.gname }}</a>
</li>
#从表中的数据再进行处理得到最后的输出值
{% endfor %}
#endfor不能忘
</ul>
- 模板使用的完美过程(2)***
概述:本次想要实现的功能是能够实现在URL中输入班级的地址就能够在页面中显示班级中的学生了
1.首先配置URL地址
想要的URL地址是http://127.0.0.1:8000/index/grade/<班级的序号>/
所以在project目录下并不需要什么改动,只要在MyApp目录下增加一些改动即可
url(r'^grade/(\d+)/$',views.GradeStudent)
2.然后再写模板(HTML页面)
<h1>班级列表信息</h1>
<ul>
{% for student in Students_List %}
<li>
<a>{{ student.sname }}</a>
</li>
{% endfor %}
</ul>
3.再需改views,从数据库中那数据,传给模板
def GradeStudent(requests,num):
#定义一个函数,该函数要和在url中调用的那个函数一致
Geted_Grade = Grade.objects.get(pk=int(num))
#根据从url中获取的数字,确定想要的班级序号,根据该序号获取相应的班级信息,并赋值给Geted_Grade
Students_List = Geted_Grade.students_set.all()
#从获取的班级中提取出其对应的班级的信息并赋值给了Students_List
return render(requests,'MyApp/GradeStudent.html',{'Students_List':Students_List})
#将获取到的信息传递给MyApp目录下的模板,并将Students_List参数中的数据传递给模板中的Students_List参数
- 流程梳理
- 创建项目**
D:\Python-Django>mkdir 流程梳理
D:\Python-Django>cd 流程梳理
D:\Python-Django\流程梳理>django-admin startproject MyApp
#创建项目
D:\Python-Django\流程梳理>cd MyApp
D:\Python-Django\流程梳理\MyApp>
- 在项目内创建App
D:\Python-Django\流程梳理\MyApp>python manage.py startapp Yo
D:\Python-Django\流程梳理\MyApp>cd Yo
- 激活App
在MyApp中的settings.py文件中的INSTALLED_APPS 进行激活
添加上一个
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'Yo',
#Yo就是激活的App
]
- 在mysql中进行配置,比如新建数据库等
- 在settings.py文件中配置数据库
概述:因为之前已经配置过了数据库,所以无需再一次的书写,只要复制过来,稍加修改即可
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'new',
#这个NAME可能会被修改,表示的是数据库的名称
'USER':'root',
'PASSWORD':'******',
'HOST':'localhost',#服务器
'PORT':3306,#端口
}
}
- 在__init__.py文件中进行数据库的配置
#同样的只需要复制过来就好
import pymysql
pymysql.install_as_MySQLdb()
- 创建模型类
在models.py文件中进行修改
概述:因为这个之前我们也创建了。而且基本上所有的类我们都已经用过了,所以说,我们只需要把之前的拿来然后稍加修改就可
- 在settings.py文件中配置模板目录
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')],
#要配置的地方,还是复制一下就好
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
- 生成迁移文件
D:\Python-Django\流程梳理\MyApp>python manage.py makemigrations
No changes detected
- 执行迁移
python manage.py migrate
D:\Python-Django\流程梳理\MyApp>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying sessions.0001_initial... OK
D:\Python-Django\流程梳理\MyApp>
- 运行服务器,进行验证
python manage.py runserver
-
在项目的目录下创建一个templates模板目录,并在里面再创建一个app的目录
-
创建一个简单的视图
from django.http import HttpResponse
def simple_resp(requests):
return HttpResponse('There is it !')
- 在项目的目录下修改urls.py
from django.contrib import admin
from django.urls import path
from django.urls import include
#引入
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', include('Yo.urls')),
#添加url路径
]
- 在App的内部创建一个urls.py文件并进行修改
from django.conf.urls import url
#引入,复制一下就好
from . import views
#引入同目录下的视图,好让视图发挥它的控制作用
urlpatterns =[
url('simple/',views.simple)
]
#设置urlpatterns,设置好它的网页url
#想好该网页要实现的功能,然后设置好它要调用的views视图下的函数
我只是一个普通人,不喜欢太大的压力,一直输出会垮掉,我也希望被人温柔以待,不会过分,像我一样就好。
不想退并不是不会退
–2019.8.30
- 模型
<1>Django对各种数据库都提供了很好的支持,并且为这些数据库提供了统一的API接口
<2>配饰数据库
- 在项目目录下的__init__.py文件中进行修改
添加:
import pymysql
pymysql.install_as_MySQLdb()
- 修改settings.py文件
<3>开发流程 - 配置数据库
- 定义模型类 :一个模型类在数据库中对应一张数据表
- 生成迁移文件
- 进行数据迁移
- 使用模型进行增删改查操作
<4>ORM - 对象-关系-映射
- 任务1:根据对象的类型生成表结构
- 任务2:将对象,列表的操作转化成sql语句
- 列表3:将sql语句查询到的结果转化成对象,列表
- 优点:极大的减轻了工作人员的工作量,不需要面对因数据库的改变而修改代码
<5>定义模型
<6>定义属性 - 概述
django根据属性的类型确定一下的信息
当前选择的数据库支持字段的类型
渲染管理表单时使用的默认html控件
在管理站点最低限度的验证
django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键后,则则django不会再生成默认的主键列
属性命名限制
不能时python的保留关键字
由于django的查询方式,不允许使用连续的下划线
- 库
定义属性时,需要字段类型,字段类型被定义子啊django.db.models.fields目录下,为了方便使用,被导入到django.db.models中
使用方式
导入from django.bd import models
通过models.Field创建字段类型的对象,赋值给属性
- 逻辑删除
对于重要的数据都做逻辑删除,不做物理删除,实现方式时isDelete属性,类型为BooleanField,默认值为False
- 字段类型
1.AutoField
一个很具实际ID自动增长的IntegerField(整形),通常如果不指定那么一个主键字段将自动添加到模型中
2.CharField(max_length=字符长度)
字符串,默认的表单样式时TextInput
3.TextField
大文本字段,一般超过4000使用,默认的表单控件是Textarea
4.IntegerField
整数
5.DecimalField(max_digits=None,decimal_places=None)
·使用python的Demical实例表示十进制浮点数
·参数说明
·DecimalField.max_digits 位数总数
·DecimalField.demical_places小数点后的位数
6.FloatField
·用python的float实例来表示浮点数
7.BooleanField
·True/False 字段,此字段的默认表单控制是CheckboxInput
8.NullBooleanField
·支持null/true/false三种值
9.DateField([auto_now=False,auto_now_add=False])
·使用python的datetime.date实例表示时间
·参数说明
DateField.auto_now
每次保存对象时,自动设置该字段为当前时间,用于最后一次<修改>!
DateField.auto_now_add
当对象第一次被创建时自动设置为当前时间,用于创建时间戳,它总是使用当前时间,默认值为False
#注意两个参数不能同时使用,毕竟只有一个值,你要么给最后一次修改的时间,要么给创建的时间
last_time = models.DateField(auto_now=true)
crete_time = models.DateField(auto_now_add=True)
10.TimeField([auto_now=False,auto_now_add=False])
·使用python的datetime.time实例表示时间
11.DateTimefield([auto_now=False,auto_now_add=False])
·使用python的datetime.datetime实例表示时间
12.FileField
上传文件的字段
13.ImageField
确保上传的文件只能是图片
- 字段选项
概述:
·通过字段选项,可以实现对字段的约束
·在字段对象时通过关键字参数指定
1.db_column="字段名"
该选项设置的是在数据库中该字段对应的名称,如果没有设置,那么默认就是在模板中设置的名称
实例:
gboynum = models.IntegerField(db_column='age')
#此时该字段在数据库中的名称就是age而不是gboynum
2.default=
默认值
3.unique
如果为True,那么这个字段在表中必须有唯一值
- 属性中的关系
·ForeignKey:一对多,将字段定义在多的端中
·用一访问多
格式:
对象.模型类(小写)_set
示例:
grade.students_set
·访问id
格式:
·对象.属性_id
示例:
·students.sgrade_id
<6>完整流程
1.如果没有数据库,那么就要创建一个数据库,然后在settings.py文件中配置好数据库
2.执行迁移
3.在models.py文件中定义好类
class Grade(models.Model):
gname = models.CharField(max_length=20)
gdate = models.DateTimeField()
ggirlnum = models.IntegerField()
gboynum = models.IntegerField(db_column='age')
isDelete = models.BooleanField()
class Students(models.Model):
sname = models.CharField(max_length=20)
sgender = models.BooleanField(default=True)
sage = models.IntegerField()
scontend = models.CharField(max_length=20)
isDelete = models.BooleanField(default=False)
# 关联外键
sgrade = models.ForeignKey('Grade', on_delete=models.CASCADE)
4.利用cmd在项目目录下
python manage.py shell
>>> from Yo.models import Students
>>> from datetime import *
#引入必要的库
#从APP中引入模型中定义的类,然后才能对类ii女性操作,毕竟你是在项目目录下打开的shell,只有引入之后才能确定操作的对象
>>> stu = Students()
#这就相当于新建了一个Students的字段了
>>> stu.sname = '于海洋'
>>> stu.sage = 19
>>> stu.scontend = 'yo,bro!'
#对字段进行赋值,而且必须赋值完成才能save,否则会报错
#突然记起来在Students中还有关联外键这一项,必须要关联到Grade中的一个班级才行,但是Grade中还没要创建字段,所以我们要先创建完才能将他们关联,一个Students字段才算完整的创建成功
>>> from Yo.models import Grade
>>> gra = Grade()
>>> gra.gname = '交运2'
>>> gra.gdate = datetime(year=2019,month=5,day=21)
#在此处,对时间的操作使用了datetime函数
>>> gra.ggirlnum=11
>>> gra.gboynum=19
>>> gra.isDelete=False
>>> gra.save()
#设置完成后一定得保存
>>> stu.sgrade=gra
#关联外键
>>> stu.save()
<7>元选项
- 在模型类中定义Meta类,用于设置元信息
- db_table 定义数据表名,推荐使用小写字母,数据表名默认为项目名小写_类名小写
class Grade(models.Model):
gname = models.CharField(max_length=20)
gdate = models.DateTimeField()
ggirlnum = models.IntegerField()
gboynum = models.IntegerField(db_column='age')
isDelete = models.BooleanField()
#
class Meta:
db_table = 'Students'
ordering = ['id']
- ordering 对象的默认排序字段,获取对象的列表时使用
ording['id'] 升序
ording-['id'] 降序
注意:
排序会增加数据库的资源开销
<8>模型成员
- 类属性
- – objects 是Manage类型的一个对象,作用是与数据库进行交互
- 当定义模型的时候没有指定管理器,则django为模型创建一个名为objects的管理器
- 自定义模型管理器(objects就不好使了)
class Grade(models.Model):
#这就是自定义的模型管理器
graObj = models.Manager()
gname = models.CharField(max_length=20)
gdate = models.DateTimeField()
ggirlnum = models.IntegerField()
gboynum = models.IntegerField(db_column='age')
isDelete = models.BooleanField()
- 自定义管理器Manager类:模型管理器是django的模型进行与数据库交互的接口,一个模型类可以有多个模型管理器
- 自定义管理器Manager类:作用
1.向管理器类中添加额外的方法
2.修改管理器返回的原始查询值
class GradeManager(models.Manager):
def get_queryset(self):
return super(StudentsManager, self).get_queryset().filter(isDelete=False)
class Grade(models.Model):
gname = models.CharField(max_length=20)
gdate = models.DateTimeField()
ggirlnum = models.IntegerField()
gboynum = models.IntegerField(db_column='age')
isDelete = models.BooleanField()
stuOBJ = models.Manager()
stuOBJ1 = StudentsManager()
- 创建对象
--当创建对象时,django不会对数据库进行操作,当调用save()时才会与数据库交互,将对象保存在数据库表中
--注意:__init__方法已经在父类models.Model中使用,在自定义中无法使用
- 在模型类中增加一个方法
概述:我们想要创建一个方法,这个方法能够实现向Students表中添加student,我们把它命名为createStudents,并且能够实现如果访问http://127.0.0.1:8000/index/addstu/就能返回一个HttpResponse,提示我们成功的添加了一个student
1.首先我们在models中的Students类中进行修改添加该函数
class Students(models.Model):
sname = models.CharField(max_length=20)
sgender = models.BooleanField(default=True)
sage = models.IntegerField()
scontend = models.CharField(max_length=20)
isDelete = models.BooleanField(default=False)
# 关联外键
sgrade = models.ForeignKey('Grade', on_delete=models.CASCADE)
# 定义一个【类方法】创建对象
@classmethod
# 表明这是类方法
@classmethod
def createStudents(cls, name, gender, age, contend, isDelete, grade):
stu = cls(sname=name, sgender=gender, sage=age, scontend=contend,
isDelete=isDelete, sgrade=grade)
#可以看到
return stu
2.在views中
from .models import Students,Grade
def addstu(requests):
gra = Grade.stuOBJ.get(pk=1)
stu = Students.createStudents('于海洋','True',19,'我是于海洋','False',gra)
stu.save()
return HttpResponse('fqewrabegdxfcgbv')
3.在urls中
urlpatterns =[
url('simple/',views.simple),
url('addstu/',views.addstu)
]