Django的ORM
ORM(Object Relational Mapping)
概念:
对象-关系映射(OBJECT/RELATIONALMAPPING,简称ORM),是随着面向对象的软件开发方法发展而产生的。用来把对象模型表示的对象映射到基于S Q L 的关系模型数据库结构中去。这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的 SQ L 语句打交道,只需简单的操作实体对象的属性和方法[2] 。O R M 技术是在对象和关系之间提供了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化[1] 。
ORM
特殊的语法:一个简单的语法,翻译成sql语句
语法:
1.数据操作库表 创建表,删除表,修改表
2.操作数据库行 对于数据的增删改查
怎么连接数据库
1.需要手动创建数据库,ORM不能创建数据库
create database mysite charset=utf8;
2.手写一段代码,告诉django连接的是哪一个数据库,这里我们使用的是mysql数据库,sqlite3只用作测试使用
这一段代码是写在项目的settings.py中的 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #ENGINE数据库引擎 'NAME': "mysite", #数据库的库名 "USER":"root", #登陆mysql的用户名 "PASSWORD":"123456", #登陆mysql的密码 "HOST":"127.0.0.1", #mysql数据库的IP "PORT":3306, #端口 } }
这段代码是写在项目的_init_.py文件中的,是大项目的文件中,不能写在小项目的这个文件中 import pymysql #调用pymysql pymysql.install_as_MySQLdb() #告诉django使用的数据库是mysql
给django发布命令
1.python manage.py makemigrations #相当于去你的models.py里面看一下有没有信息改动 2.python manage.py migrate # 把改动翻译成sql语句,然后去数据库执行
总结详细步骤:
1.手动创建数据库
2.创建django项目,并创建子项目app01

3.在django项目的settings.py里面配置上数据库的相关信息
4.在django项目里的_init_.py里面写上两行代码,告诉django用pymysql代替默认的MySQLdb
import pymysql
pymysql.install_as_MySQLdb()
5.在子目录app01的models.py文件中写上类,执行第六步时会创建数据库的表,这里拿学生表和老师表为例
class Class(models.Model): id = models.AutoField(primary_key=True) cname = models.CharField(max_length=32, null=True) first_day = models.DateField() class Student(models.Model): id = models.AutoField(primary_key=True) sname = models.CharField(max_length=32)
1、models.AutoField 自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。 2、models.CharField 字符串字段 必须 max_length 参数 3、models.BooleanField 布尔类型=tinyint(1) 不能为空,Blank=True 4、models.ComaSeparatedIntegerField 用逗号分割的数字=varchar 继承CharField,所以必须 max_lenght 参数 5、models.DateField 日期类型 date 对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。 6、models.DateTimeField 日期类型 datetime 同DateField的参数 7、models.Decimal 十进制小数类型 = decimal 必须指定整数位max_digits和小数位decimal_places 8、models.EmailField 字符串类型(正则表达式邮箱) =varchar 对字符串进行正则表达式 9、models.FloatField 浮点类型 = double 10、models.IntegerField 整形 11、models.BigIntegerField 长整形 integer_field_ranges = { 'SmallIntegerField': (-32768, 32767), 'IntegerField': (-2147483648, 2147483647), 'BigIntegerField': (-9223372036854775808, 9223372036854775807), 'PositiveSmallIntegerField': (0, 32767), 'PositiveIntegerField': (0, 2147483647), } 12、models.IPAddressField 字符串类型(ip4正则表达式) 13、models.GenericIPAddressField 字符串类型(ip4和ip6是可选的) 参数protocol可以是:both、ipv4、ipv6 验证时,会根据设置报错 14、models.NullBooleanField 允许为空的布尔类型 15、models.PositiveIntegerFiel 正Integer 16、models.PositiveSmallIntegerField 正smallInteger 17、models.SlugField 减号、下划线、字母、数字 18、models.SmallIntegerField 数字 数据库中的字段有:tinyint、smallint、int、bigint 19、models.TextField 字符串=longtext 20、models.TimeField 时间 HH:MM[:ss[.uuuuuu]] 21、models.URLField 字符串,地址正则表达式 22、models.BinaryField 二进制 23、models.ImageField 图片 24、models.FilePathField 文件
1、null=True 数据库中字段是否可以为空 2、blank=True django的 Admin 中添加数据时是否可允许空值 3、primary_key = False 主键,对AutoField设置主键后,就会代替原来的自增 id 列 4、auto_now 和 auto_now_add auto_now 自动创建---无论添加或修改,都是当前操作的时间 auto_now_add 自动创建---永远是创建时的时间 5、choices GENDER_CHOICE = ( (u'M', u'Male'), (u'F', u'Female'), ) gender = models.CharField(max_length=2,choices = GENDER_CHOICE) 6、max_length 7、default 默认值 8、verbose_name Admin中字段的显示名称 9、name|db_column 数据库中的字段名称 10、unique=True 不允许重复 11、db_index = True 数据库索引 12、editable=True 在Admin里是否可编辑 13、error_messages=None 错误提示 14、auto_created=False 自动创建 15、help_text 在Admin中提示帮助信息 16、validators=[] 17、upload-to
6.给django发布命令
python manage.py makemigrations #相当于去models.py里面看一下有没有信息改动
python manage.py migrate #把改动翻译成sql语句,然后去数据库执行
7.在urls.py里面写上对应关系
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^student_user/',views.student_user), # url(r'^admin/', admin.site.urls), ]
8.在子项目app01的views.py文件中写上视图函数
from django.shortcuts import render,HttpResponse,redirect from . import models #前面在models里面创建好了数据库的表 # Create your views here. def student_user(request): # 查询出所有的user #下面的objects是固定语法,必须要加上 student_list=models.Student.objects.all() #查询到的是一个由student对象组成的列表 #<QuerySet [<Student: Student object>, <Student: Student object>, <Student: Student object>, <Student: Student object>]> print(student_list) student0=models.Student.objects.first() #Student object 查询出来的是一个student对象中的第一个 print(student0.sname) student2 = models.Student.objects.last() #Student object 查询出来的是一个student对象中的最后一个 print(student2.sname) student3=models.Student.objects.filter(sname="alex") #<QuerySet [<Student: Student object>]>查询出来的是一个列表 #若果有多个条件,就在第一个条件之后加上逗号,两个条件是and 也就是当两个条件同时成立时,查询所要查询的数据 print(student3) # arg_dict={"sname":"alex"} # user4=models.Student.objects.filter(**arg_dict) #把字典拆成关键字参数传进去,**arg_dict打散了传进去 # print(user4[0].sname) #alex 由于查到的结果是一个列表里面是对象,所以按照索引把对象取出来,再查看数据 # # 为什么get用的比较少(get和filter都是查询) # user5=models.Student.objects.get(sname="sb") #条件不满足时就报错 # print(user5.sname) user6=models.Student.objects.filter(id=3) # 是可以用逻辑去判断的 if len(user6)>0: print(user6[0].username) else:print("没有这个用户") #打印结果为"没有这个用户" 原因是数据库中没有id为3的学生 user7=models.Student.objects.exclude(sname="alex") #这种方法不常使用,查询除了名字不是alex的学生, print(user7) #<QuerySet [<Student: Student object>, <Student: Student object>, <Student: Student object>]> # 创建记录, # 第一种创建方式,生成数据并且提交到数据库 # new_student=models.Student.objects.create(sname="yuan",cid=1) # print(new_student.sname,new_student.cid) # 第二种创建方式 # 只创建了数据,但是没有向数据库提交 # new_student2=models.Student(sname="张三",cid="4") # # 向数据库提交 # new_student2.save() # print(new_student2) #Student object 创建的new_student2是一个对象 ,一个对象就是一行记录 # 删除 # 先查到要删除的数据 models.Student.objects.filter(sname="yuan").delete() #删除同时也提交 # 改:第一种方式 # 首先要知道改谁,然后再去改 # models.Student.objects.filter(cid=4).update(sname="李四") #修改之后同时提交 # 第二种方式 # student10=models.Student.objects.filter(cid=1).first() # student10.sname="somebody" # # 提交一下 # student10.save() #如果不提交数据不会进入到数据库 return render(request,"users.html",{"student_list":student_list}) # return HttpResponse("OK")

出现上面截图中信息的原因是创建好的表结构中的字段默认是不能为空的.
models.py -->django翻译成sql -->pymysql --->mysql 四部
1.通过建一个类(继承models.Model) -->相当于创建了一个数据库中的表 ->类 --数据库
2.字段:
1.models.AutoField(primary_key=True) -->int 自增 主键
2.models.CharField(max_length=64,null=true) 默认是不能为空的,为空时设置null=true
3.models.IntegerField() # int类型


数据行的操作 增:两种 User是models里面的类的名字,objects是语法要求,必须要写的 1.models.User.objects.create(**{})#直接创建并且提交到数据库(在py文件中写这一行,在访问网页时,在经过路由系统执行对应的函数时,就把sql执行了, 并且也提交到了数据库) 2.user=models.User(**{}) user.save() #创建后并没有立即被提交到数据库中,在执行到user.save之后,数据才被提交到数据库中 删:找到对象删除 models.User.objects.filter().delete() #直接删除并且提交到数据库 改: 更新 有两种方式 1.models.User.objects.filter().update(更新的字段名称=更新的字段的值) 2.user=models.User.objects.get(id=1) user.username="张三" user.save() 相当于给类中的某个属性重新赋值 查: models.User.objects.all() 查找所有的,查找结果返回的是由对象组成的列表 models.User.objects.get(条件) 根据条件查找,不满足条件就报错,返回的是一个对象 models.User.objects.filter(条件) 根据条件查找,不满足条件也不报错,但返回的结果是一个对象的列表 models.User.objects.filter().first() 取出由对象组成的列表中的第一个元素(也就是第一个对象) models.User.objects.filter().last() 取出由对象组成的雷彪中的最后一个元素(也就是最后一个对象) models.User.objects.exclude(条件) 查找不包含该条件的信息

浙公网安备 33010602011771号