ORM概念:

  MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动

  ORM是“对象-关系-映射”的简称。

ORM之单表操作:

1.1 表的创建:

  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)
  8. state=models.BooleanField()
  9. pub_date=models.DateField()
  10. price=models.DecimalField(max_digits=8,decimal_places=2)
  11. publish=models.CharField(max_length=32)

1.2 相关字段参数

  1. '''
  2.  
  3. <1> CharField
  4. 字符串字段, 用于较短的字符串.
  5. CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数.
  6.  
  7. <2> IntegerField
  8. #用于保存一个整数.
  9.  
  10. <3> FloatField
  11. 一个浮点数. 必须 提供两个参数:
  12.  
  13. 参数 描述
  14. max_digits 总位数(不包括小数点和符号)
  15. decimal_places 小数位数
  16. 举例来说, 要保存最大值为 999 (小数点后保存2位),你要这样定义字段:
  17.  
  18. models.FloatField(..., max_digits=5, decimal_places=2)
  19. 要保存最大值一百万(小数点后保存10位)的话,你要这样定义:
  20.  
  21. models.FloatField(..., max_digits=19, decimal_places=10)
  22. admin 用一个文本框(<input type="text">)表示该字段保存的数据.
  23.  
  24. <4> AutoField
  25. 一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段;
  26. 自定义一个主键:my_id=models.AutoField(primary_key=True)
  27. 如果你不指定主键的话,系统会自动添加一个主键字段到你的 model.
  28.  
  29. <5> BooleanField
  30. A true/false field. admin 用 checkbox 来表示此类字段.
  31.  
  32. <6> TextField
  33. 一个容量很大的文本字段.
  34. admin 用一个 <textarea> (文本区域)表示该字段数据.(一个多行编辑框).
  35.  
  36. <7> EmailField
  37. 一个带有检查Email合法性的 CharField,不接受 maxlength 参数.
  38.  
  39. <8> DateField
  40. 一个日期字段. 共有下列额外的可选参数:
  41. Argument 描述
  42. auto_now 当对象被保存时,自动将该字段的值设置为当前时间.通常用于表示 "last-modified" 时间戳.
  43. auto_now_add 当对象首次被创建时,自动将该字段的值设置为当前时间.通常用于表示对象创建时间.
  44. (仅仅在admin中有意义...)
  45.  
  46. <9> DateTimeField
  47. 一个日期时间字段. 类似 DateField 支持同样的附加选项.
  48.  
  49. <10> ImageField
  50. 类似 FileField, 不过要校验上传对象是否是一个合法图片.#它有两个可选参数:height_field和width_field,
  51. 如果提供这两个参数,则图片将按提供的高度和宽度规格保存.
  52. <11> FileField
  53. 一个文件上传字段.
  54. 要求一个必须有的参数: upload_to, 一个用于保存上载文件的本地文件系统路径. 这个路径必须包含 strftime #formatting,
  55. 该格式将被上载文件的 date/time
  56. 替换(so that uploaded files don't fill up the given directory).
  57. admin 用一个<input type="file">部件表示该字段保存的数据(一个文件上传部件) .
  58.  
  59. 注意:在一个 model 中使用 FileField ImageField 需要以下步骤:
  60. 1)在你的 settings 文件中, 定义一个完整路径给 MEDIA_ROOT 以便让 Django在此处保存上传文件.
  61. (出于性能考虑,这些文件并不保存到数据库.) 定义MEDIA_URL 作为该目录的公共 URL. 要确保该目录对
  62. WEB服务器用户帐号是可写的.
  63. 2 在你的 model 中添加 FileField ImageField, 并确保定义了 upload_to 选项,以告诉 Django
  64. 使用 MEDIA_ROOT 的哪个子目录保存上传文件.你的数据库中要保存的只是文件的路径(相对于 MEDIA_ROOT).
  65. 出于习惯你一定很想使用 Django 提供的 get_<#fieldname>_url 函数.举例来说,如果你的 ImageField
  66. 叫作 mug_shot, 你就可以在模板中以 {{ object.#get_mug_shot_url }} 这样的方式得到图像的绝对路径.
  67.  
  68. <12> URLField
  69. 用于保存 URL. verify_exists 参数为 True (默认), 给定的 URL 会预先检查是否存在( URL是否被有效装入且
  70. 没有返回404响应).
  71. admin 用一个 <input type="text"> 文本框表示该字段保存的数据(一个单行编辑框)
  72.  
  73. <13> NullBooleanField
  74. 类似 BooleanField, 不过允许 NULL 作为其中一个选项. 推荐使用这个字段而不要用 BooleanField null=True 选项
  75. admin 用一个选择框 <select> (三个可选择的值: "Unknown", "Yes" "No" ) 来表示这种字段数据.
  76.  
  77. <14> SlugField
  78. "Slug" 是一个报纸术语. slug 是某个东西的小小标记(短签), 只包含字母,数字,下划线和连字符.#它们通常用于URLs
  79. 若你使用 Django 开发版本,你可以指定 maxlength. maxlength 未指定, Django 会使用默认长度: 50. #在
  80. 以前的 Django 版本,没有任何办法改变50 这个长度.
  81. 这暗示了 db_index=True.
  82. 它接受一个额外的参数: prepopulate_from, which is a list of fields from which to auto-#populate
  83. the slug, via JavaScript,in the object's admin form: models.SlugField
  84. (prepopulate_from=("pre_name", "name"))prepopulate_from 不接受 DateTimeFields.
  85.  
  86. <13> XMLField
  87. 一个校验值是否为合法XML的 TextField,必须提供参数: schema_path, 它是一个用来校验文本的 RelaxNG schema #的文件系统路径.
  88.  
  89. <14> FilePathField
  90. 可选项目为某个特定目录下的文件名. 支持三个特殊的参数, 其中第一个是必须提供的.
  91. 参数 描述
  92. path 必需参数. 一个目录的绝对文件系统路径. FilePathField 据此得到可选项目.
  93. Example: "/home/images".
  94. match 可选参数. 一个正则表达式, 作为一个字符串, FilePathField 将使用它过滤文件名.
  95. 注意这个正则表达式只会应用到 base filename 而不是
  96. 路径全名. Example: "foo.*\.txt^", 将匹配文件 foo23.txt 却不匹配 bar.txt 或 foo23.gif.
  97. recursive可选参数.要么 True 要么 False. 默认值是 False. 是否包括 path 下面的全部子目录.
  98. 这三个参数可以同时使用.
  99. match 仅应用于 base filename, 而不是路径全名. 那么,这个例子:
  100. FilePathField(path="/home/images", match="foo.*", recursive=True)
  101. ...会匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif
  102.  
  103. <15> IPAddressField
  104. 一个字符串形式的 IP 地址, (i.e. "24.124.1.30").
  105. <16> CommaSeparatedIntegerField
  106. 用于存放逗号分隔的整数值. 类似 CharField, 必须要有maxlength参数.
  107.  
  108. '''  

1.3补充参数

  1. (1)null
  2.  
  3. 如果为TrueDjango 将用NULL 来在数据库中存储空值。 默认值是 False.
  4.  
  5. (1)blank
  6.  
  7. 如果为True,该字段允许不填。默认为False
  8. 要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
  9. 如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。
  10.  
  11. (2)default
  12.  
  13. 字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。
  14.  
  15. (3)primary_key
  16.  
  17. 如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True
  18. Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
  19. 否则没必要设置任何一个字段的primary_key=True
  20.  
  21. (4)unique
  22.  
  23. 如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的
  24.  
  25. (5)choices
  26. 由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,<br>而且这个选择框的选项就是choices 中的选项。

1.4有关于setting的配置

  若想将模型转为mysql数据库中的表,需要在settings中配置:

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

注意1:NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动创建 USER和PASSWORD分别是数据库的用户名和密码。设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。然后,启动项目,会报错:no module named MySQLdb 。这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb 对于py3有很大问题,所以我们需要的驱动是PyMySQL 所以,我们只需要找到项目名文件下的__init__,在里面写入:

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

 数据迁移:

  1. python manage.py makemigrations
  2. python manage.py migrate

2.有关单表的增删改查功能

2.1 添加表记录

  可采用create和save的方法

  1. 添加方法一:
  2. ret0 = Book(title="菊花宝典",price="",publish="太监出版社",date="2222-02-02")
  3. ret0.save()
  4. print(ret0.title)
  5. 添加方法二:
  6. ret = Book.objects.create(title="葵花宝典",price="",publish="阉割出版社",date="1111-11-11")
  7. print(ret)

2.2 表的查询

  2.2.1查询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(): 从返回结果中剔除重复纪录

  2.2.2 基于双下划綫的模糊查询

  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)

  2.2.3详细使用示例:

  1. 1.all
  2. queryset = Book.objects.all() # queryset对象是模型类对象的集合
  3. print(queryset)
  4.  
  5. 2.first last # 返回模型类对象
  6. queryset = Book.objects.first()
  7. queryset = Book.objects.last()
  8. print(queryset)
  9.  
  10. 3 filter:返回的queryset对象
  11. queryset = Book.objects.filter(date="2222-02-02")
  12. queryset = Book.objects.filter(title="葵花宝典")
  13. queryset = Book.objects.filter(title="菜花宝典") #<QuerySet []>
  14. print(queryset)
  15.  
  16. 4 get:有且只有一个查询结果:返回模型类对象 若结果大于1个或无 直接报错 慎用
  17. obj = Book.objects.get(title="葵花宝典")
  18. print(obj.title)
  19.  
  20. 5 排除方法;
  21. 按条件排除
  22. queryset=Book.objects.exclude(title="葵花宝典") #排除title等于葵花宝典的模型对象
  23. print(queryset)
  24.  
  25. 6 queryset.orderby
  26. queryset=Book.objects.all() # 默认按id排序
  27.  
  28. queryset=Book.objects.all().order_by("-price","-id") #默认是升序排序,前面加-代表降序排序,第二个参数代表当第一个参数相同时,按第二个排序
  29. print("queryset",queryset)
  30.  
  31. 7 reverse方法
  32. Book.objects.all().order_by("-price").reverse()
  33.  
  34. 8 exists
  35. print(Book.objects.all().exists())
  36. if Book.objects.all().exists():
  37. print("OK")
  38. 9 values 自带for循环
  39. (1)values 得到的结果形式为: [{},{}...]
  40. queryset = Book.objects.filter(price=52).values("title", "publish")
  41. '''
  42. 模拟过程
  43. l=[] # queryset()
  44. for obj in queryset:
  45. l.append({
  46. "title":obj.title,
  47. "price":obj.price,
  48. ....
  49. })
  50.  
  51. [obj1,obj2...]
  52. [{"title":"葵花宝典","price":52},{"title":"菊花宝典","price":52}..]
  53.  
  54. '''
  55. print(queryset)
  56. print(queryset.count())
  57.  
  58. (2)values_list得到的结果形式为: [(), ()...]
  59. queryset = Book.objects.filter(price=52).values_list("title", "publish")
  60. '''
  61. l=[] # queryset()
  62. for obj in queryset:
  63. l.append((obj.title,obj.price))
  64.  
  65. [obj1,obj2]
  66. [("葵花宝典",52),("葵花宝典",252)]
  67.  
  68. '''
  69. print(queryset) # <QuerySet [('Python', Decimal('200.00')), ('Linux', Decimal('200.00'))]>
  70. print(queryset.count())
  71.  
  72. 10 distinct #去重
  73. ret = Book.objects.values("title").distinct()
  74. print(ret)
  75. print(ret.count())
  76.  
  77. 查询价格大于200的书籍
  78. ret = Book.objects.filter(price__gt=52) #大于
  79. ret1 = Book.objects.filter(price__gte=52) #大于等于
  80. print(ret,ret1)
  81. 查询书籍名称以py开头
  82. ret = Book.objects.filter(title__startswith="py")
  83. ret = Book.objects.filter(title__contains="py")
  84. ret = Book.objects.filter(title__icontains="py") #不区分大小写
  85. ret = Book.objects.filter(price__range=[100, 500]) #在100-500区间内
  86. ret = Book.objects.filter(price__in=[100, 500]) #当价格等于100或500
  87. ret = Book.objects.filter(date__year=2222)
  88. print(ret)

2.3 表的删除

  1. 无论queryset 还是 模型对象都有xxx.delete()的方法
  2.  
  3. Book.objects.all().delete()
  4. Book.objects.filter(price=200).delete()
  5. book=Book.objects.get(id=3)
  6. book.delete()

2.4表的修改

  1.  
  2. Book.objects.filter(id=4).update(price=11, title="花菜菜宝典",publish="农名出版社",date="2012-03-08")
  3.  
  4. practice(博客):
  5. (1)book = Book.objects.filter(publish="太监出版社",price__gt=20).all()
  6. (2)book = Book.objects.filter(title__startswith="花菜", date__year=2012,date__month=3).all()
  7. (3)book = Book.objects.filter(price__in=[11,52,100]).all().values("title","publish")
  8. (4)book = Book.objects.filter(price__range=[10,50]).all().values("title", "price")
  9. (5)查询所有人民出版社出版的书籍的价格(从高到低排序,去重)
  10. book = Book.objects.filter(publish="太监出版社").order_by("-price").values("price").distinct()
  11. print(book)

Django中模型层中ORM的单表操作的更多相关文章

  1. Django之模型层第一篇:单表操作

    Django之模型层第一篇:单表操作 一 ORM简介 ​ 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数 ...

  2. Django的模型层(1)- 单表操作(上)

    一.ORM简介       MTV或者MTV框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的 ...

  3. 6、Django之模型层第一篇:单表操作

    一 ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数据库管理软件,例如mysql.oracle ...

  4. Django的模型层(1)- 单表操作(下)

    一.查询表记录 在学习查询表记录之前,先了解一下QuerySet,这是一种类似列表的数据类型,是由ORM创建的.我们学习查询表记录的方法时,一定要明确哪些方法返回了QuerySet类型,哪些方法返回m ...

  5. Django之模型层第二篇:多表操作

    Django之模型层第二篇:多表操作 一 表关系回顾 ​ 在讲解MySQL时,我们提到,把应用程序的所有数据都放在一张表里是极不合理的. ​ 比如我们开发一个员工管理系统,在数据库里只创建一张员工信息 ...

  6. Django的模型层(2) - 多表操作(下)

    一.多表查询 1.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接 ...

  7. 7、Django之模型层第二篇:多表操作

    一 表关系回顾 在讲解MySQL时,我们提到,把应用程序的所有数据都放在一张表里是极不合理的. 比如我们开发一个员工管理系统,在数据库里只创建一张员工信息表,该表有四个字段:工号.姓名.部门名.部门职 ...

  8. Django的模型层(2)- 多表操作(上)

    一.创建模型 例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一(on ...

  9. ORM的单表操作

    ORM的单表操作 MTV框架包含一个重要的部分就是ORM----对象关系映射(Object Relational Mapping),它实现了数据模型与数据库的解耦,即数据模型的设计.利用它我们不需要依 ...

随机推荐

  1. 简单的栈溢出demo

    Code package startnow; /** * @auther draymonder */ public class StackOverFlowTest { public static vo ...

  2. R语言 union、setdiff、insect

    union 求两个向量的并集集合可以是任何数值类型 union(x=1:3, y=2:5)[1] 1 2 3 4 5 union(x=c("abc", "12" ...

  3. ASP.NET Core2.1 中如何使用 Cookie和Session

    https://blog.csdn.net/canduecho/article/details/80651853 ASP.NET Core2.1的官方项目模板在创建的Razor Pages和MVC项目 ...

  4. [ajaxupload] - 上传文件同时附件参数值

    $.ajax({ url: '/excel/importExcel?instance='+"品种1", type: 'POST', data: formData, 上面前端通过?拼 ...

  5. Kubernetes工作流之Pods一

    This page provides an overview of Pod, the smallest deployable object in the Kubernetes object model ...

  6. linux lsof/netstat查看进程和端口号相关命令:

    本文为博主原创,未经允许不得转载: 在linux操作时,经常要查看运行的项目的进程和端口号,在这里总结了以下常用到的相关命令: 1.查看系统运行的java项目,并查看进程号 这个用到的命令为: ps ...

  7. SAP FI 常用表

    SAP FI 常用表 GL 部分: FAGLFLEXT 新总账汇总表 GLT0 旧总帐汇总表 SKA1 总账科目主记录 (科目表) 科目表层数据 SKAT 总帐科目主记录(科目表:说明) 包括语言代码 ...

  8. Oracle imp导入数据

    拿到别人给的dmp文件如何导入自己的库中呢?上码: 代码: imp dms/123321@orcl file=F:\TP_ZG_20171208.DMP feedback=10000 buffer=1 ...

  9. Pandas 基础(3) - 生成 Dataframe 的几种方式

    这一节想总结一下 生成 Dataframe 的几种方式: CSV Excel python dictionary List of tuples List of dictionary 下面分别一一介绍具 ...

  10. django 消息框架 message

    在网页应用中,我们经常需要在处理完表单或其它类型的用户输入后,显示一个通知信息给用户. 对于这个需求,Django提供了基于Cookie或者会话的消息框架messages,无论是匿名用户还是认证的用户 ...