一、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()
 Book(nid=2,title='alex传',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)的更多相关文章

  1. 67、django之模型层(model)--查询补充及mookie

    本篇导航: F查询与Q查询 cookie 一.F查询与Q查询 1.以Book表为例 class Book(models.Model) : title = models.CharField(max_le ...

  2. django之模型层(model)--查询补充及cookie

    已经连续写了好几篇django的模型层(model)增删改查的随笔了,没篇大篇幅都是查询相关的操作,可以看出查询在数据的操作中是多么的重要,而本篇最后再补充一点关于关于查询的一些方法,模型层基本的操作 ...

  3. 64、django之模型层(model)--建表、查询、删除基础

    要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...

  4. django之模型层(model)--建表、查询、删除基础

    要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...

  5. 65、django之模型层(model)--添加、单表查询、修改基础

    上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...

  6. django之模型层(model)--添加、单表查询、修改基础

    上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...

  7. 66、django之模型层(model)--多表相关操作(图书管理小练习)

    前面几篇随笔的数据库增删改查操作都是在单表的操作上的,然而现实中不可能都是单表操作,更多的是多表操作,一对一,一对多,多对多的表结构才是我们经常需要处理的,本篇将带我们了解多表操作的一些相关操作.也会 ...

  8. django之模型层(model)--多表相关操作(图书管理小练习)

    前面几篇随笔的数据库增删改查操作都是在单表的操作上的,然而现实中不可能都是单表操作,更多的是多表操作,一对一,一对多,多对多的表结构才是我们经常需要处理的,本篇将带我们了解多表操作的一些相关操作.也会 ...

  9. 06.Django基础五之django模型层(二)多表操作

    一 创建模型 表和表之间的关系 一对一.多对一.多对多 ,用book表和publish表自己来想想关系,想想里面的操作,加外键约束和不加外键约束的区别,一对一的外键约束是在一对多的约束上加上唯一约束. ...

随机推荐

  1. Linux服务器配置---配置telnet

    配置telnet      通过配置文件,我们可以设置telnet的连接时间.连接数.连接ip等,实现更加安全的连接 1.设置连接时间,参数“access_times” [root@localhost ...

  2. web前端----Bootstrap框架补充

    一.一个小知识点 1.截取长屏的操作 2.设置默认格式 3.md,sm, xs 4.空格和没有空格的选择器 二.响应式介绍 - 响应式布局是什么? 同一个网页在不同的终端上呈现不同的布局等- 响应式怎 ...

  3. js监听页面是否在浏览器当前页面

    在最近的一个socket项目中,需要监听客户端是否已读客服端发送的消息. 这里用到了html5中document新增了一个事件 visibilitychange,这个事件在页面前台或后台切换时被触发, ...

  4. OpenCV Using Python——基于SURF特征提取和金字塔LK光流法的单目视觉三维重建 (光流、场景流)

    https://blog.csdn.net/shadow_guo/article/details/44312691 基于SURF特征提取和金字塔LK光流法的单目视觉三维重建 1. 单目视觉三维重建问题 ...

  5. MySQL备份与恢复-innobackupex

    :上一片myloder搞崩溃,为什么百度的博文都是抄袭一模一样的,哎烦! 这一片文章我们来介绍物理备份工具xtracebackup! 首先是安装可以percona官网下载安装,下载rpm包直接yum安 ...

  6. zabbix配置自动发现,故障邮件告警

    对网段内的主机进行自动发现,自动加入主机组,自定加入template 创建动作时,类型这里选择discovery 然后将发现的主机加入host group和template: 动作针对的是discov ...

  7. 20145105 《Java程序设计》第10周学习总结

    20145105 <Java程序设计>第10周学习总结 教材学习内容总结 JAVA网络编程 一.网络概述 (一)计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据 ...

  8. 20165310 Java实验五《网络编程与安全》

    20165310 Java实验五<网络编程与安全> 任务一 题目:①编写MyBC.java实现中缀表达式转后缀表达式的功能:②编写MyDC.java实现从上面功能中获取的表达式中实现后缀表 ...

  9. HTML标签(持续更新)

    HTML的文档结构: 1.<html> 2.<head>:放置HTML文件的信息,如定义CSS样式代码可放置在此标签中 3.<title>:放置网页的标题 4.&l ...

  10. 关于fragment点击穿透的问题

    当一个activity有多个fragment的时候,点击当前显示的fragment,如果点击处在其他fragment中也有相应的控件,那么可能会点击穿透,有响应另外fragment事件的趋势.但是这个 ...