文档章节

Django进阶 1.1 ORM基础—ORM 1.2.1 增删改查之查询 1.2.2 删改增 (1) 1.2.3 删改增 (2)

 隐匿的蚂蚁
发布于 01/20 04:51
字数 933
阅读 6
收藏 3

ORM基础

ORM是Django操作数据库的API,Django的作者将sql语句封装在里面供我们使用。

我们前面还提到过Django提供一个模拟数据库的工具,sqlite,供我们学习测试使用。

如果我们想使用mysql,需要在setting中更改database选项,修改

DATABASES = {
	'default': {
		'ENGINE': 'django.db.backends.mysql', 
		'NAME': 'books',    #你的数据库名称
		'USER': 'root',   #你的数据库用户名
		'PASSWORD': '', #你的数据库密码
		'HOST': '', #你的数据库主机,留空默认为localhost
		'PORT': '3306', #你的数据库端口
	}
}

然后修改__init__文件 写入 import pymysql pymysql.install_as_MySQLdb()

之前说过,在数据库中创建表的时候就是在modules中创建类

一些类型

class School(models.Model): name = models.CharField(max_length=32,blank=True,verbose_name='名称') mac = models.URLField(max_length=32,blank=True,verbose_name='名称') ## URL 类型(其实数据类型都是一样的,不过django在处理的时候会做一些判断) mail = models.EmailField(max_length=32,blank=True,verbose_name='邮箱') yes_no = models.BooleanField(max_length=32,blank=True,verbose_name='是否') date = models.DateField(default="",verbose_name="日期") num = modelsIntegerField(default="",verbose_name="日期")

One to One

class Number(models.Model): models.OneToOneField(to='UserInfo',verbose_name="学号")

学号可能和userinfo是一一对应的的关系,那么我们可以把他们写成onetoone ,其实也可以直接把他写进userinfo的表里

一对多

cla = models.ForeignKey(to='Class')   #会链接表(根据生成的ID)

多对多

models.ManyToManyField(to='UserInfo')

这种会在数据库中生成新的表,记录ID

class UserInfo(models.Model): username=models.CharField(max_length=32,null=True) password=models.CharField(max_length=32,null=True) def str(self): return self.username ##这样可以直接返回username的内容,在后面的ORM的查询中很方便

1.2 增删改查

查询所有的数据

我们先在views中修改之前的test函数

def test(request):
	dic = {'a':1,'b':2}
	dic_json = json.dumps(dic)
	school_li = models.School.objects.all()  ## 会返回一个列表
	for item in school_li:
		print (school_li)  ## 我们在models的School类中定义了一个函数 __str__,我们可以通过这个来发现它的作用,直接打印school_li就可以打印结果
		print (item,type(item))
	return HttpResponse(dic_json)

查询单条数据

 school = models.School.objects.get(id=1)
	print (school,type(school),school.name)

不知道查询几条数据

obj = models.School.objects.filter(name='No.1school')
print (obj)

obj = models.School.objects.filter(name='No.1school').first() ##第一个值
obj = models.School.objects.filter(name='No.1school').last()  ##最后一个值

检索的时候有get和filter两种方法,推荐使用filter,当get查不到值的时候会报错,但是filter会返回空的QuerySet list

传入字典变量

dic = {'name':'No.1school'}
obj = models.School.objects.filter(**dic).first()
print (obj)

dic1 = {'name':'New_school'}
obj = models.School.objects.create(**dic1)
print (obj,type(obj),obj.name)

删除

删除其实是基于filter来实现的,可以查完对返回的对象进行删除操作 dic = {'name':'No.1school'} obj = models.School.objects.filter(**dic).first() obj.delete()

也可以直接这样

dic1 = {'name':'New_school'}
obj = models.School.objects.filter(**dic1).delete()
print (obj,type(obj))

我们新建了两张表

(2, {'Django111.School': 2}) <class 'tuple'>

返回的是一个元组,第一个值是删除的条数,第二个是属于哪个类,删除的条数

dic1 = {'name':'New_school'}
dic2 = {'name':'New_school2'}
obj = models.School.objects.filter(**dic2).update(**dic1)
print(obj,type(obj))

get方法

会返回修改次数,数据类型是int

除此之外可以用get的方式

使用方法和filter类似

dic = {'name':'No.1school'}
obj = models.School.objects.get(**dic)
obj.name="New_No.1school"
obj.save()
print(obj,type(obj))

>>>
New_No.1school <class 'Django111.models.School'>

get方法的性能会比filter略差,且查不到值的时候会报错,所以我们在修改数据的时候推荐使用filter方法

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 22
码字总数 15129
作品 0
青岛
私信 提问
Python的基础知识之常用类型-列表

每种语言都有基本的数据类型,比如整型、浮点型、字符串、列表等,但是小编今天主要记录列表数据类型。 tmpdir17971506_52.gif 列表(list) 在Python中有序可变的元素集合叫做列表,其他语言...

摸着石头过河_崖边树
2017/12/15
0
0
中式 dao 和 orm 框架 - MicroDao

micro-dao中式dao和orm框架 MicroDao为了解决mybatis固有缺陷,进行全新封装的dao框架,功能覆盖mybatis,且比mybatis更灵活。 MicroDao同时支持mysql和oracle MicroDao相对mybatis的优点: ...

杰睿宁
2017/12/26
317
0
6,ORM组件XCode(撬动千万级数据)

有了前面的《动手》,基本上可以进行开发了。本篇我们来试试XCode的基本功功力如何,测试在单表一千万业务数据的环境下查询的速度,添删改等没什么可测试的。其实应该说是XCode开发模式的功力...

大石头
2010/12/21
0
0
Python3基础之学习笔记(十二)-Django简介-Django常用命令-Django项目目录介绍-views和urls-Templates

文章目录 1. Django 1. Django 1.1 Django简介 Django 中提供了开发网站经常用到的模块,常见的代码都为你写好了,通过减少重复的代码,Django 使你能够专注于 web 应用上有 趣的关键性的东西...

GoldenKitten
01/17
0
0
Python3基础之学习笔记(十三)-Django文件上传-CBV和FBV-URL-ORM

文章目录 1. Django 1. Django 1.2 Django获取多个数据以及文件上传 前端代码 form要加 views.py 1.3 Django的CBV和FBV CBV指一个url对应一个类,FBV指一个url对应一个函数。 CBV写法 url里写...

GoldenKitten
01/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

学习设计模式之路

https://java-design-patterns.com/patterns/ https://www.oodesign.com/ https://www.programering.com/a/MTNxAzMwATY.html https://design-patterns.readthedocs.io/zh_CN/latest/ https:/......

晨猫
今天
1
0
JDK1.8 jar包说明

JDK 1.8 lib:access-bridge-64.jarcharsets.jarcldrdata.jardeploy.jardnsns.jarjaccess.jarjavawa.jarjce.jarjfr.jarjfxrt.jarjfxswt.jarjsse.jarlocaledata.jar......

冷基
今天
1
0
判断用户的icloud是否开启【Swift4.2】

使用icloudkit存储用户私人数据时,必须判断用户的icloud是否开启【Swift4.2】 func isICloudContainerAvailable()-> Bool { if FileManager.default.ubiquityIdentityToken != ni......

叶落花开
今天
4
0
今天的学习

1、执行git add *命令就把改动提交到了暂存区,执行git pull命令将远程仓库的数据拉到当前分支并合并,执行git checkout [branch-name]切换分支 2、执行git commit -m '说明' 命令就把改动提...

墨冥
昨天
0
0
Android4.4 及以下TextView,Button等控件使用矢量图报错

1 问题描述 最近项目开发中,图标资源我尽量使用了矢量图,然而配置了基本的兼容设置,程序在低版本中运行还是出现了问题。 xml布局文件中,在TextView中使用矢量图,比如android:drawableS...

newtrek
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部