1、orm简介

2、

models.py

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class Book(models.Model):
  6. id = models.AutoField(primary_key=True)
  7. title = models.CharField(max_length=32, unique=True)
  8. state = models.BooleanField()
  9. pub_date = models.DateField()
  10. price = models.DecimalField(max_digits=8, decimal_places=2) # 999999.00
  11. publish = models.CharField(max_length=22) # 10000000.00 溢出
  1. C:\Windows\system32>mysql -uroot -proot
  2.  
  3. mysql> create database orm; # 创建orm数据库
  4. Query OK, 1 row affected (0.00 sec)

settings默认sqlite3数据库

设置database为mysql

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'NAME': 'orm', # 要连接的数据库,连接前需要创建好
  5. 'USER': 'root', # 连接数据库的用户名
  6. 'PASSWORD': 'root', # 连接数据库的密码
  7. 'HOST': '127.0.0.1', # 连接主机,默认本级
  8. 'PORT': 3306, # 端口 默认3306
  9. }
  10. }

  (3)django调用的是pymysql

报错:

  1. E:\PycharmProjects\cnblog>python manage.py makemigrations
  2. Traceback (most recent call last):
  3. File "C:\Users\Venicid\AppData\Local\Programs\Python\Python36\lib\site-packages\django\db\backends\mysql\base.py", line , in <module>
  4. import MySQLdb as Database
  5. ModuleNotFoundError: No module named 'MySQLdb'
  6.  
  7. The above exception was the direct cause of the following exception:
  8.  
  9. Traceback (most recent call last):
  10. File "manage.py", line , in <module>
  11. execute_from_command_line(sys.argv)
  12. File "C:\Users\Venicid\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\management\__init__.py", line , in execute_from_command_line
  13. utility.execute()
  14. File "C:\Users\Venicid\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\management\__init__.py", line , in execute
  15. django.setup()
  16. File "C:\Users\Venicid\AppData\Local\Programs\Python\Python36\lib\site-packages\django\__init__.py", line , in setup
  17. apps.populate(settings.INSTALLED_APPS)
  18. File "C:\Users\Venicid\AppData\Local\Programs\Python\Python36\lib\site-packages\django\apps\registry.py", line , in populate
  19. app_config.import_models()
  20. File "C:\Users\Venicid\AppData\Local\Programs\Python\Python36\lib\site-packages\django\apps\config.py", line , in import_models
  21. self.models_module = import_module(models_module_name)
  22. File "C:\Users\Venicid\AppData\Local\Programs\Python\Python36\lib\importlib\__init__.py", line , in import_module
  23. return _bootstrap._gcd_import(name[level:], package, level)
  24. File "<frozen importlib._bootstrap>", line , in _gcd_import
  25. File "<frozen importlib._bootstrap>", line , in _find_and_load
  26. File "<frozen importlib._bootstrap>", line , in _find_and_load_unlocked
  27. File "<frozen importlib._bootstrap>", line , in _load_unlocked
  28. File "<frozen importlib._bootstrap_external>", line , in exec_module
  29. File "<frozen importlib._bootstrap>", line , in _call_with_frames_removed
  30. File "C:\Users\Venicid\AppData\Local\Programs\Python\Python36\lib\site-packages\django\contrib\auth\models.py", line , in <module>
  31. from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
  32. File "C:\Users\Venicid\AppData\Local\Programs\Python\Python36\lib\site-packages\django\contrib\auth\base_user.py", line , in <module>
  33. class AbstractBaseUser(models.Model):
  34. File "C:\Users\Venicid\AppData\Local\Programs\Python\Python36\lib\site-packages\django\db\models\base.py", line , in __new__
  35. new_class.add_to_class('_meta', Options(meta, app_label))
  36. File "C:\Users\Venicid\AppData\Local\Programs\Python\Python36\lib\site-packages\django\db\models\base.py", line , in add_to_class
  37. value.contribute_to_class(cls, name)
  38. File "C:\Users\Venicid\AppData\Local\Programs\Python\Python36\lib\site-packages\django\db\models\options.py", line , in contribute_to_class
  39. self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
  40. File "C:\Users\Venicid\AppData\Local\Programs\Python\Python36\lib\site-packages\django\db\__init__.py", line , in __getattr__
  41. return getattr(connections[DEFAULT_DB_ALIAS], item)
  42. File "C:\Users\Venicid\AppData\Local\Programs\Python\Python36\lib\site-packages\django\db\utils.py", line , in __getitem__
  43. backend = load_backend(db['ENGINE'])
  44. File "C:\Users\Venicid\AppData\Local\Programs\Python\Python36\lib\site-packages\django\db\utils.py", line , in load_backend
  45. return import_module('%s.base' % backend_name)
  46. File "C:\Users\Venicid\AppData\Local\Programs\Python\Python36\lib\importlib\__init__.py", line , in import_module
  47. return _bootstrap._gcd_import(name[level:], package, level)
  48. File "C:\Users\Venicid\AppData\Local\Programs\Python\Python36\lib\site-packages\django\db\backends\mysql\base.py", line , in <module>
  49. ) from err
  50. django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.

解决:

__init__.py

  1. import pymysql
  2.  
  3. pymysql.install_as_MySQLdb()

注意2:确保配置文件中的INSTALLED_APPS中写入我们创建的app名称

注意3:如果报错的话

  1. django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11.None

  

注意4: 如果想打印orm转换过程中的sql,需要在settings中进行如下配置:

  1. LOGGING = {
  2. 'version': 1,
  3. 'disable_existing_loggers': False,
  4. 'handlers': {
  5. 'console':{
  6. 'level':'DEBUG',
  7. 'class':'logging.StreamHandler',
  8. },
  9. },
  10. 'loggers': {
  11. 'django.db.backends': {
  12. 'handlers': ['console'],
  13. 'propagate': True,
  14. 'level':'DEBUG',
  15. },
  16. }
  17. }  

  1. 最后通过两条数据库迁移命令即可在指定的数据库中创建表
  2.  
  3. python manage.py makemigrations
  4. python manage.py migrate

插入数据,创建表

3、单表操作之添加记录

url

  1. from django.urls import path, re_path, include
  2. from app01 import views
  3.  
  4. urlpatterns = [
  5. re_path(r'^index/$', views.index, name='index')
  6. ]

方法1:

view

  1. from django.shortcuts import render, HttpResponse
  2.  
  3. # Create your views here.
  4.  
  5. from app01.models import Book # 导入Book对象
  6.  
  7. def index(request):
  8. # 添加表记录
  9.  
  10. # 方式1: # 所有字段必须和modles的一一对应
  11. book_obj = Book(
  12. id=1,
  13. title='pyhon红宝书',
  14. state=True,
  15. price=10,
  16. pub_date='2012-02-21',
  17. publish='人民出版社'
  18. )
  19. book_obj.save() # 相当于commit提交
  20.  
  21. return HttpResponse('<h1>数据操作成功</h1>')

启动django

方法2:

  1. from django.shortcuts import render, HttpResponse
  2.  
  3. # Create your views here.
  4.  
  5. from app01.models import Book
  6.  
  7. def index(request):
  8. # 添加表记录
  9.  
  10. # 方式2: 推荐使用 Book.objects:表的管理器
  11. book_obj = Book.objects.create(
  12. title='php',
  13. state=True,
  14. price=100,
  15. pub_date='2018-09-09',
  16. publish='南京出版社',
  17. )
  18.  
  19. # create返回值就是当前生成表的对象记录
  20. print(book_obj.title)
  21. print(book_obj.price)
  22. print(book_obj.pub_date)
  23.  
  24. return HttpResponse('<h1>数据操作成功</h1>')

4、单表操作之查询API

查询API

  1. <1> all(): 查询所有结果
  2.  
  3. <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
  4.  
  5. <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
  6. 如果符合筛选条件的对象超过一个或者没有都会抛出错误。
  7.  
  8. <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
  9.  
  10. <5> order_by(*field): 对查询结果排序
  11.  
  12. <6> reverse(): 对查询结果反向排序
  13.  
  14. <8> count(): 返回数据库中匹配查询(QuerySet)的对象数量。
  15.  
  16. <9> first(): 返回第一条记录
  17.  
  18. <10> last(): 返回最后一条记录
  19.  
  20. <11> exists(): 如果QuerySet包含数据,就返回True,否则返回False
  21.  
  22. <12> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
  23. model的实例化对象,而是一个可迭代的字典序列
  24. <13> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
  25.  
  26. <14> distinct(): 从返回结果中剔除重复纪录

modles

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class Book(models.Model):
  6. id = models.AutoField(primary_key=True)
  7. title = models.CharField(max_length=32, unique=True)
  8. state = models.BooleanField()
  9. pub_date = models.DateField()
  10. price = models.DecimalField(max_digits=8, decimal_places=2) # 999999.00
  11. publish = models.CharField(max_length=22) # 10000000.00 溢出
  12.  
  13. def __str__(self): # 调用Book对象返回title
  14. return self.title

QuerySet:新的数据类型

  1. <QuerySet [<Book: pyhon红宝书>, <Book: php>]>

  

  1. # ###### 查询表记录
  2. """
  3. 1.方法的返回值
  4. 2.方法的调用者
  5. """

  (1)all方法

  1. # 1. all() 调用者:Book.objects 返回值QuerySet对象
  2. book_list = Book.objects.all()
  3. print(book_list) # [obj1, obj2, ....]
  4.  
  5. for obj in book_list:
  6. print(obj.title, obj.price)
  7.  
  8. print(book_list[1].title)
  9. print(book_list[1].price)

  (2)first last

  1. # 2. first,last() : 调用者QuerySet对象 返回值:model对象
  2. book_obj1 = Book.objects.all().first()
  3. book_obj2 = Book.objects.all()[0]
  4. print(book_obj1)
  5. print(book_obj2)

  (3)filter

  1. # 3.filter() 调用者:Book.objects 返回值QuerySet对象
  2. book_list = Book.objects.filter(price=100) # [obj1,obj2...]
  3. print(book_list)
  4. book_list1 = Book.objects.filter(price=100, title='go')
  5. print(book_list1)

  (4)get方法

  1. # 4.get() 有且只有一个返回值,才有意义 返回值model对象
  2. book_obj1 = Book.objects.get(title='go')
  3.  
  4. # book_obj1 = Book.objects.get(title='lalala') # 没有返回值,报错
  5. # book_obj2 = Book.objects.get(price=100) # php go都是price=100 报错
  6. print(book_obj1)

  (5)exclude

  1. # 5.exclude() 返回值QuerySet对象
  2. book_obj = Book.objects.exclude(title='go') # 取反
  3. print(book_obj)

  

  (6)order by

  1. # 6. order by() 调用者QuerySet对象 返回值QuerySet对象
  2. book_obj1 = Book.objects.order_by('id')
  3. book_obj2 = Book.objects.order_by('-id') # 反序
  4. book_obj3 = Book.objects.order_by('price', 'id') # price一样的话,按照id排序
  5. print(book_obj1)
  6. print(book_obj2)
  7. print(book_obj3)

  (7)count

  1. # 7. count 调用者QuerySet对象 返回值int数字
  2. ret = Book.objects.all().count() # 数字
  3. print(ret)

  (8) exist

  1. # 8. exist()
  2. ret = Book.objects.all()
  3. ret1 = Book.objects.all().exists() # limit 1
  4. if ret:
  5. print('ok')
  6.  
  7. if ret1:
  8. print('oK2')

  (9)values

  1. # 9. values() 调用者QuerySet对象 返回者QuerySet对象
  2.  
  3. ret = Book.objects.all()
  4. for item in ret:
  5. print(item.title)
  6.  
  7. ret1 = Book.objects.all().values('price')
  8. # < QuerySet[{'price': Decimal('10.00')}, {'price': Decimal('100.00')}, {'price': Decimal('100.00')}] >
  9. print(ret1)
  10.  
  11. ret2 = Book.objects.all().values('price', 'title')
  12. # <QuerySet [{'price': Decimal('10.00'), 'title': 'pyhon红宝书'}, {'price': Decimal('100.00'), 'title': 'php'}, {'price': Decimal('100.00'), 'title': 'go'}]>
  13. print(ret2)
  14.  
  15. """
  16. values:
  17.  
  18. temp = []
  19.  
  20. for obj in Book.objects.all():
  21. temp.append({
  22. 'price'=obj.price,
  23. 'title'=obj.title,
  24. })
  25.  
  26. return temp
  27. """

  (10)values_list

  1. # 10. values_list方法 调用者QuerySet对象 返回值QuerySet对象
  2. ret = Book.objects.all().values_list('price', 'title')
  3. # < QuerySet[(Decimal('10.00'), 'pyhon红宝书'), (Decimal('100.00'), 'php'), (Decimal('100.00'), 'go')] >
  4.  
  5. print(ret)

  1. """
  2. values: list字典
  3. <QuerySet [{'price': Decimal('10.00'), 'title': 'pyhon红宝书'},
  4. {'price': Decimal('100.00'), 'title': 'php'},
  5. {'price': Decimal('100.00'), 'title': 'go'}]>
  6. values_list: 元组
  7. <QuerySet [(Decimal('10.00'), 'pyhon红宝书'),
  8. (Decimal('100.00'), 'php'),
  9. (Decimal('100.00'), 'go')]>
  10. """

  (11)distinct

  1. # 11. distinct
  2. ret = Book.objects.all().distinct() # id不同,不能去重
  3. print(ret)
  4.  
  5. ret1 = Book.objects.all().values('price')
  6. print(ret1)
  7.  
  8. ret = Book.objects.all().values('price').distinct() # 存在相同price,可以去重
  9. print(ret)

  (12)点语法

  1. # 12. 点语法
  2. Book.objects.all().filter('price').order_by('id').filter('title').reverse().first()

5、单表查询之模糊查询

基于双下划线的模糊查询

  1. Book.objects.filter(price__in=[100,200,300])
  2. Book.objects.filter(price__gt=100)
  3. Book.objects.filter(price__lt=100)
  4. Book.objects.filter(price__range=[100,200])
  5. Book.objects.filter(title__contains="python")
  6. Book.objects.filter(title__icontains="python")
  7. Book.objects.filter(title__startswith="py")
  8. Book.objects.filter(pub_date__year=2012)
  1. # ############ 单表查询 模糊查询
  2. ret = Book.objects.filter(price__gt=100) # 大于100
  3. print(ret)
  4. ret1 = Book.objects.filter(title__startswith='p') # 以p开头
  5. print(ret1)
  6. ret2 = Book.objects.filter(title__startswith='py')
  7. print(ret2)
  8. ret3 = Book.objects.filter(title__contains='h') # 包含h就行
  9. print(ret3)
  10. ret4 = Book.objects.filter(title__icontains='h') # 包含h,H就行
  11. print(ret4)
  12. ret5 = Book.objects.filter(price__in=[10, 100]) # 价格是10 或者100
  13. print(ret5)
  14.  
  15. # 对于 pub_date = models.DateField()
  16. ret6 = Book.objects.filter(pub_date__year=2018) # year是2018
  17. print(ret6)
  18. ret7 = Book.objects.filter(pub_date__month=6) # year是2018
  19. print(ret7)

6、单表之删除与修改表记录

  (1)delete

  1. # 13. delete
  2. # 调用者QuerySet对象
  3. Book.objects.filter(price=200).delete() # 直接过滤删除
  4. ret = Book.objects.filter(price=100).delete()
  5. print(ret) # (2, {'app01.Book': 2}) 返回删除的数据2条
  6.  
  7. # 调用者models对象
  8. Book.objects.filter(price=10).first().delete() # 先查询再删除

  (2)update

  1. # 14. update 调用者QuerySet对象
  2. ret = Book.objects.filter(title='go').update(title='PYTHON')
  3. print(ret)

07 -模型层ORM的更多相关文章

  1. 07 模型层 orm相关查询 F查询Q查询 django开启事务

    一.Django终端打印SQL语句 如果你想知道你对数据库进行操作时,Django内部到底是怎么执行它的sql语句时可以加下面的配置来查看 在Django项目的settings.py文件中,在最后复制 ...

  2. python 全栈开发,Day70(模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介)

    昨日内容回顾 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 Quer ...

  3. Django基础(2)--模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介

    没整理完 昨日回顾: 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 ...

  4. Django模型层—ORM

    目录 一.模型层(models) 1-1. 常用的字段类型 1-2. 字段参数 1-3. 自定义char字段 1-4. 外键关系 二.Django中测试脚本的使用 三.单表操作 3-1. 添加记录 3 ...

  5. 1127 模型层orm表操作

    目录 昨日回顾 模型层 1.配置测试脚本 1.1 应用下tests文件 1.2 新建任意名称文件 2. 数据的增删改查 2.1 创建数据 2.2 修改数据 2.3 删除数据 2.4查询数据 十三门徒 ...

  6. Django模型层ORM学习笔记

    一. 铺垫 1. 连接Django自带数据库sqlite3 之前提到过Django自带一个叫做sqlite3的小型数据库,当我们做本地测试时,可以直接在sqlite3上测试.不过该数据库是小型的,在有 ...

  7. (17)模型层 -ORM之msql 单表的增、删、改、查 及其他操作

    单表操作-增.删.改.查 ret=models.User.objects.filter(id=1)  #这里的结果是一个queryset对象 ret=modles.User.Objects.filte ...

  8. 模型层ORM操作

    一.ORM操作 1.关键性字段及参数 DateField 年月日 DateTimeField 年月日时分秒 auto_now: 每次操作改数据都会自动更新时间 auto_now_add: 新增数据的时 ...

  9. (18)模型层 -ORM之msql 多表操作(字段的属性)

    数据库表的对应关系 1.一对一   #关联字段写在那张表都可以 PS:只要写OneToOneField就会自动加一个id 2.一对多  #关系确立,关联字段写在多的一方 3.多对多   #多对多的关系 ...

随机推荐

  1. node-sass 解决 no such file or directory

    在使用node-sass编译的时候出现以下情况 Error: ENOENT: no such file or directory, scandir 'D:\xxxx\node_modules\.npm ...

  2. 【Kettle】8、变量参数传递介绍

    本文为转载,感觉作者的辛勤劳作:http://blog.csdn.net/rotkang/article/details/21008271 ------------------------------ ...

  3. 记开发个人图书收藏清单小程序开发(三)DB设计

    主要是参考豆瓣的图书查询接口: https://api.douban.com/v2/book/isbn/:9780132350884 返回内容如下: { "rating": { & ...

  4. [UI] 精美UI界面欣赏[8]

    精美UI界面欣赏[8]

  5. 更改SQL实例端口

    为SQL Server使用非标准的端口 你正在使用标准的端口号1433来连接SQL Server 2005吗?你考虑过设置SQL Server来监听一个不同于1433的端口号吗?我曾经就是这样.在这篇 ...

  6. 字典 & 列表表达式 结合

    题: 思路: 要求的结果是小字典里面的两个值组成的列表,所以只要抓到小字典,这个题就可以用列表推导式直接表达了.所 以把小字典设为元素d,然后用d在列表里面遍历,列表呢,是大字典的一个值. 答案:  

  7. Basestation函数解析(二)

    ---恢复内容开始--- 这部分从Basestation的RecvDataThread开始,流程为 RecvDataThread->RecvData->Decoder->PostDa ...

  8. 洛谷 P4011 孤岛营救问题【最短路+分层图】

    题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...memset初始化INF用错了数...然后手残敲错一个状态一直过不了样例...要是这状态去比赛我简直完了......or ...

  9. 1.1 What Is This Book About(这本书是关于什么的)

    CHAPTER 1 Preliminaries(预备知识) 1.1 What Is This Book About?(这本书是关于什么的) 这本书关心的是如何用Python对数据进行处理和清洗等操作. ...

  10. ARC与Toll-Free Bridging

    arc模块与mrc模块的沟通. 相当于程序的混编处理. Toll-Free Briding保证了在程序中,可以方便和谐的使用Core Foundation类型的对象和Objective-C类型的对象. ...