python-day68--模型层基础(model)
一、ORM : object relationship mapping 对象映射关系
映射关系:
- 表名 <-------> 类名
- 字段 <-------> 属性
- 表记录 <------->类实例对象
二、创建表(建立模型) 必须是先创建表,再启动项目
- class Book(models.Model):
nid
=
models.AutoField(primary_key
=
True
)
title
=
models.CharField( max_length
=
32
)
publishDate
=
models.DateField()
price
=
models.DecimalField(max_digits
=
5
,decimal_places
=
2
)
keepNum
=
models.IntegerField()
publishDate
='2017-10-25',price='100.22',keepNum=2) #实例化对象就是在Book表中添加 记录创建数据库的两条命令:
- python manage.py makemigrations #app01(应用中的migrations文件夹中会生成一个文件)这是第一步:翻译,把你写的类中的信息进行调整,对应
- python manage.py migrate #这是第二步 :是把sql语句执行,所有的表才会生成
注意1:.sqlite3 数据库会自动创建数据库,不需要提前创建,直接启动项目就可以了
注意2:使用mysql数据库时,在第一步创建库的时候django会报错,那是因为django默认按mysqldb执行,但是在python3版本中,没有mysqldb,只有pymysql,故: 在应用(app01)下面的__init__.py中需配置一下:
- import pymysql
- pymysql.install_as_MySQLdb()
然后再执行创建数据库的命令。
注意3:更换mysql数据库时需要在settings中更改设置
- #把 sqlite3数据库有关 信息 注释掉
- # DATABASES = {
- # 'default': {
- # 'ENGINE': 'django.db.backends.sqlite3',
- # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
- # }
- # }
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.mysql',
- 'NAME': 'blog', #你的数据库名称
- 'USER': 'root', #你的数据库用户名
- 'PASSWORD': '', #你的数据库密码
- 'HOST': '', #你的数据库主机,留空默认为localhost
- 'PORT': '', #你的数据库端口
- }
- }
补充:在settings文件中通过logging的设置可以查看翻译成的sql语句
- LOGGING = {
- 'version': 1,
- 'disable_existing_loggers': False,
- 'handlers': {
- 'console': {
- 'level': 'DEBUG',
- 'class': 'logging.StreamHandler',
- },
- },
- 'loggers': {
- 'django.db.backends': {
- 'handlers': ['console'],
- 'propagate': True,
- 'level': 'DEBUG',
- },
- }
- }
三、添加表记录
1.普通字段: 推荐使用方式2
- 方式1 :类的实例化,需要save
- publish_obj=Publish(name="人民出版社",city="北京",email="renMin@163.com")
- publish_obj.save() # 将数据保存到数据库
- 方式2 返回值publish_obj是添加的记录对象 ,不需要save
- publish_obj=Publish.objects.create(name="人民出版社",city="北京",email="renMin@163.com")
四、修改表记录
- # 修改方式1:save(效率低)
- book_obj=models.Book.objects.filter(nid=id)[0]
- book_obj.title="金平"
- book_obj.save()
- #效率低是因为不管你是不是修改一个字段的值,django都会重新把所有的字段值赋值一遍。
# 修改方式2: 推荐使用
models.Book.objects.filter(nid=1).update(title='title',author='author',publishDate='pubDate',price='price')
五、删除表记录
- models.Info.objects.filter(id=1).delete()
- models.Info.objects.get(id=1).delete()
六、查询表记录
1.查询相关API
- <1> all(): 查询所有结果
- <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象,可以多个条件,在括号内用逗号隔开
- <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
- 如果符合筛选条件的对象超过一个或者没有都会抛出错误。
- <5> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
- <4> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
- model的实例化对象,而是一个可迭代的字典序列
- <9> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
- <6> order_by(*field): 对查询结果排序
- <7> reverse(): 对查询结果反向排序
- <8> distinct(): 从返回结果中剔除重复纪录
- <10> count(): 返回数据库中匹配查询(QuerySet)的对象数量。
- <11> first(): 返回第一条记录
- <12> last(): 返回最后一条记录
- <13> exists(): 如果QuerySet包含数据,就返回True,否则返回False
- 查询方法API:
- 1 all: models.表名.objects.all()
- book_all=models.Book.objects.all() # 结果是querySet集合 [model对象,....]
- print(book_all) # <QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]>
- 2 filter: models.表名.objects.filter() # 结果是querySet集合 [model对象,....]
- ret1=models.Book.objects.filter(author="yuan") # # <QuerySet [<Book: 追风筝的人>, <Book: asd>]>
- ret2=models.Book.objects.filter(nid=1) # <QuerySet [<Book: yuan>]>
- ret2=models.Book.objects.filter(author="yuan",price=123) # <QuerySet [<Book: yuan>]>
- print(ret2)
- 3 get models.表名.objects.get() # model对象
- ret3=models.Book.objects.get(author="yuan")
- print(ret3.price)
- 4 exclude : 排除条件
- ret4=models.Book.objects.exclude(author="yuan")
- print(ret4)
- 5 values方法
- ret=models.Book.objects.filter(author="yuan").values("title","price")
- print(ret)# <QuerySet [{'title': '追风筝的人', 'price': Decimal('99.00')}, {'title': 'asd', 'price': Decimal('123.00')}]>
- 6 values_list方法
- ret = models.Book.objects.filter(author="yuan").values_list("title", "price")
- print(ret) # <QuerySet [('追风筝的人', Decimal('99.00')), ('asd', Decimal('123.00'))]>
- 7 distinct方法
- ret=models.Book.objects.filter(author="yuan").values("author").distinct()
- print(ret)
- 8 count方法
- ret=models.Book.objects.filter(author="yuan").count()
- print(ret)
- 9 first 方法
- ret = models.Book.objects.all().first()
- print(ret)
- 10 exists方法
- if models.Book.objects.all().exists():
- print("exists")
- else:
- print("nothing")
API例子
注意:一定区分object与querySet的区别 !!!
2.双下划线之单表查询
- models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值
- models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
- models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
- models.Tb1.objects.filter(name__contains="ven")
- models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
- models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and
- ret=models.Book.objects.filter(price__gt=100) #大于
- ret=models.Book.objects.filter(price__gte=99) # 大于等于
- ret=models.Book.objects.filter(publishDate__year=2017,publishDate__month=10) #2017年10月
- ret=models.Book.objects.filter(author__startswith="张")
- startswith,istartswith, endswith, iendswith
python-day68--模型层基础(model)的更多相关文章
- 67、django之模型层(model)--查询补充及mookie
本篇导航: F查询与Q查询 cookie 一.F查询与Q查询 1.以Book表为例 class Book(models.Model) : title = models.CharField(max_le ...
- django之模型层(model)--查询补充及cookie
已经连续写了好几篇django的模型层(model)增删改查的随笔了,没篇大篇幅都是查询相关的操作,可以看出查询在数据的操作中是多么的重要,而本篇最后再补充一点关于关于查询的一些方法,模型层基本的操作 ...
- 64、django之模型层(model)--建表、查询、删除基础
要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...
- django之模型层(model)--建表、查询、删除基础
要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...
- 65、django之模型层(model)--添加、单表查询、修改基础
上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...
- django之模型层(model)--添加、单表查询、修改基础
上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...
- 66、django之模型层(model)--多表相关操作(图书管理小练习)
前面几篇随笔的数据库增删改查操作都是在单表的操作上的,然而现实中不可能都是单表操作,更多的是多表操作,一对一,一对多,多对多的表结构才是我们经常需要处理的,本篇将带我们了解多表操作的一些相关操作.也会 ...
- django之模型层(model)--多表相关操作(图书管理小练习)
前面几篇随笔的数据库增删改查操作都是在单表的操作上的,然而现实中不可能都是单表操作,更多的是多表操作,一对一,一对多,多对多的表结构才是我们经常需要处理的,本篇将带我们了解多表操作的一些相关操作.也会 ...
- 06.Django基础五之django模型层(二)多表操作
一 创建模型 表和表之间的关系 一对一.多对一.多对多 ,用book表和publish表自己来想想关系,想想里面的操作,加外键约束和不加外键约束的区别,一对一的外键约束是在一对多的约束上加上唯一约束. ...
随机推荐
- Linux服务器---关闭selinux
关闭selinux 1.通过命令“getenforce”获取selinux状态, [root@localhost ~]# getenforce Enforcing //enforcein ...
- 第一次使用crontab linux选择编辑器问题
第一次使用crontab linux选择编辑器问题 第一次使用crontab 时,会出现no crontab for root - using an empty one“Select a editor ...
- tomcat 9.0.4 性能调优
参考了网上的一些优化参数,但是在启动中发现 有2个报错: 11-Feb-2018 15:57:23.293 警告 [main] org.apache.catalina.startup.SetAllPr ...
- 音响理论基础入门:Gain(增益)
谈到放大器就必须先了解增益:一个小的信号Level(电平)经过放大电路成为大的信号Level ,也就是说由小变大之间的差异就叫增益,也叫放大率,反过来的叫衰减率.在音响系统内,一般以信号源的输入电平决 ...
- Linux vmstat命令实际操作介绍
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.它能够对系统的整体情况进行统计,无法对某个进程进行深入分析. ...
- 泛型编程之特性(traits)
特性(traits):对于某种可能会出错的返回值型别(Return Type),利用类模版进行部分特例化.其思想类似设计模式. 我们只能部分特例化类模板,而不能部分特例化函数模版.——<C++ ...
- 05: MySQL高级查询
MySQL其他篇 目录: 参考网站 1.1 GROUP BY分组使用 1.2 mysql中NOW(),CURDATE(),CURTIME()的使用 1.3 DATEDIFF() 函数 1.4 DATE ...
- 《网络攻防》实验八:Web基础
适逢多事之际,下周二的课设答辩.全国信安竞赛初赛作品筹备.协会密码沙龙比肩接踵,这些"案牍"不仅劳形还影响了我的复习计划."甘蔗没有两头甜的"还是要有所舍得了, ...
- 20145324王嘉澜《网络对抗技术》web安全基础实践
实验内容 •使用webgoat进行XSS攻击.CSRF攻击.SQL注入 实验问答 •SQL注入攻击原理,如何防御 ①SQL注入攻击是攻击者在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL ...
- 七个月学习Python大计
仅以此篇纪念学习Python征程的开始