默认使用sqllite数据库

修改为mysql数据库

创建数据库

在app models中编写创建数据库类

  1. from django.db import models
  2. class Book(models.Model):#表明book django 会自动使用项目名+我们自定义的表名
  3. # 如果没有自定义主键,django会自动添加一个主键,字段名id 自增
  4. name =models.CharField(max_length=20) #字段名name 类型vachar(20)
  5. price =models.IntegerField() #字段名是price 类型int
  6. pub_date =models.DateField() #表名 pub_data 类型date(时间戳)
  7. author=models.CharField(max_length=32,null=False )#默认可以为空设置null =False则不能为空

常用字段类型参数

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

Field中的参数

  1. <1> null : 数据库中字段是否可以为空
  2.  
  3. <2> blank: django的 Admin 中添加数据时是否可允许空值
  4.  
  5. <3> default:设定缺省值
  6.  
  7. <4> editable:如果为假,admin模式下将不能改写。缺省为真
  8.  
  9. <5> primary_key:设置主键,如果没有设置django创建表时会自动加上:
  10. id = meta.AutoField('ID', primary_key=True)
  11. primary_key=True implies blank=False, null=False and unique=True. Only one
  12. primary key is allowed on an object.
  13.  
  14. <6> unique:数据唯一
  15.  
  16. <7> verbose_name  Admin中字段的显示名称
  17.  
  18. <8> validator_list:有效性检查。非有效产生 django.core.validators.ValidationError 错误
  19.  
  20. <9> db_column,db_index 如果为真将为此字段创建索引
  21.  
  22. <10>choices:一个用来选择值的2维元组。第一个值是实际存储的值,第二个用来方便进行选择。
  23. 如SEX_CHOICES= (( ‘F’,'Female’),(‘M’,'Male’),)
  24. gender = models.CharField(max_length=2,choices = SEX_CHOICES)

使用mysql数据库

修改  settings中的 DATABASES 内容将

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.sqlite3',
  4. 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  5. }
  6. }

修改为

  1. DATABASES = {
  2.  
  3. 'default': {
  4.  
  5. 'ENGINE': 'django.db.backends.mysql',
  6.  
  7. 'NAME': 'books', #你的数据库名称
  8.  
  9. 'USER': 'root', #你的数据库用户名
  10.  
  11. 'PASSWORD': '', #你的数据库密码
  12.  
  13. 'HOST': '', #你的数据库主机,留空默认为localhost
  14.  
  15. 'PORT': '3306', #你的数据库端口
  16.  
  17. }
  18.  
  19. }

必须安装pymysql  pip install pymysql  支持python 连接mysql

在所在项目名下 __init__ 下增加

  1. import pymysql
  2. pymysql.install_as_MySQLdb()
  1. python manage.py makemigrations #根据app下的migrations目录中的记录,检测当前model层代码是否发生变化?
  2.  
  3. python manage.py migrate #把orm代码转换成sql语句去数据库执行
  1. python manage.py migrate --fake #只记录变化,不提交数据库操作

ORM 增删改查操作

增加数据,为了能够更好的演示效果,可以在Django 中可以直接执行python文件,但是需要在执行py文件增加一些配置,记住要放在程序最上面开头部分。

  1. import os
  2. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "untitled.settings") # NoQA
  3. import django
  4. django.setup()
  5.  
  6. "untitled.settings" 这里为你的APP 的配置文件,其他为固定写法

插入操作

  1. 方式一:
  2. book_obj=Book(title="linu111x葵花宝典",state=True,price=100,publish="苹果出版社",pub_date="2012-12-12")
  3. book_obj.save()
  4.  
  5. 方式二:
  6. # create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象
  7. book_obj=Book.objects.create(title="python葵花宝典",state=True,price=100,publish="苹果出版社",pub_date="2012-12-12")

执行该py文件

查看相对应的表插入的数据内容。

查询表记录

#all() 查询所有结果
book_list=Book.objects.all() #<QuerySet [<Book: book1>, <Book: book2>, <Book: book3>]>

#filter()它包含了与所给筛选条件相匹配的对象
book_list = Book.objects.filter(id=1)  #<QuerySet [<Book: book1>]>

#get() model对象 有且只有一个查询结果时才有意义 如果超过一个或者没有都会抛出异常
book = Book.objects.get(id=2) #<Book: book2>

#order_by() model对象 对查询结果排序
book = Book.objects.all().order_by("-id") #<QuerySet [<Book: book3>, <Book: book2>, <Book: book1>]>

#reverse() 对查询结果反向排序
book = Book.objects.all().order_by("-id").reverse()

#count() 返回匹配查询对象的数量
book = Book.objects.all().order_by("-id").count() #3

#exists() 如果Queryset包含数据,则返回true,否则返回false
book = Book.objects.all().exists()         #True

book = Book.objects.filter(id=20).exists() #False

#values() 返回一个valueQureyset 是一个可迭代的字典序列
book = Book.objects.all().values("title") #<QuerySet [{'title': 'book1'}, {'title': 'book2'}, {'title': 'book3'} ]>

#values_list() 返回的是一个元组序列,values返回的是一个字典序列
book = Book.objects.all().values_list("title")#<QuerySet [('book1',), ('book2',), ('book3',)]>

#distinct() 从返回结果中剔除重复记录
book = Book.objects.all().distinct()

#first() 返回第一条记录
book = Book.objects.all().first() #<Book: book1>

#last() 返回最后一条记录
book = Book.objects.all().last()  #<Book: book6>

#exclude() 它包含了与所给筛选条件不匹配的对象
book = Book.objects.all().exclude(id=2) #<QuerySet [<Book: book1>, <Book: book3>, <Book: book4>]>

基于双下划线的模糊查询

  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)

删除表记录

删除方法就是 delete()。它运行时立即删除对象而不返回任何值。例如:

  1. model_obj.delete()

你也可以一次性删除多个对象。每个 QuerySet 都有一个 delete() 方法,它一次性删除 QuerySet 中所有的对象。

例如,下面的代码将删除 pub_date 是2005年的 Entry 对象:

  1. Entry.objects.filter(pub_date__year=2005).delete()

在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象。例如:

  1. b = Blog.objects.get(pk=1)
  2. # This will delete the Blog and all of its Entry objects.
  3. b.delete()

要注意的是: delete() 方法是 QuerySet 上的方法,但并不适用于 Manager 本身。这是一种保护机制,是为了避免意外地调用 Entry.objects.delete() 方法导致 所有的 记录被误删除。如果你确认要删除所有的对象,那么你必须显式地调用:

  1. Entry.objects.all().delete()  

如果不想级联删除,可以设置为:

  1. pubHouse = models.ForeignKey(to='Publisher', on_delete=models.SET_NULL, blank=True, null=True)

修改表记录

  1. Book.objects.filter(title__startswith="py").update(price=120)

此外,update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。  

#在传递给模版变量的时候可以使用locals() 意思是传递给模版所有变量

Django(ORM单表操作)的更多相关文章

  1. django ORM单表操作

    1.ORM介绍 ORM是“对象-关系-映射”的简称 映射关系: mysql---------Python 表名----------类名 字段----------属性 表记录--------实例化对象 ...

  2. django框架基础-ORM单表操作-长期维护

    ###############    单表操作-添加数据    ################ import os if __name__ == '__main__': os.environ.set ...

  3. Django框架05 /orm单表操作

    Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...

  4. day59——orm单表操作

    day59 orm单表操作 对象关系映射(object relational mapping) orm语句 -- sql -- 调用pymysql客户端发送sql -- mysql服务端接收到指令并执 ...

  5. 17-2 orm单表操作和多表操作

    参考:https://www.cnblogs.com/liwenzhou/p/8660826.html 一  ORM单表操作 1 增删改查 1. 查询 1. 查所有 models.Publisher. ...

  6. Django ORM 多表操作

    目录 Django ORM 多表操作 表模型 表关系 创建模型 逆向到表模型 插入数据 ORM 添加数据(添加外键) 一对多(外键 ForeignKey) 一对一 (OneToOneFeild) 多对 ...

  7. day52:django:ORM单表/多表操作

    目录 1.ORM 2.ORM单表增删改查 13个必知必会的查询接口 filter基于双下划线的模糊查询 3.ORM多表增删改查 ORM 什么是ORM? ORM(object relational ma ...

  8. Django之模型---ORM 单表操作

    以上一随笔中创建的book表为例讲解单表操作 添加表记录 方式一 # create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象 book_obj=Book.o ...

  9. orm单表操作

    二.orm简介 ORM:object relation mapping (ORM是“对象-关系-映射”的简称) MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦, ...

  10. django第8天(在测试文件中运行django项目|单表操作)

    django第8天 在测试文件中运行django项目 1.将项目配置文件数据库该为mysql,修改配置信息 PORT = '127.0.0.1' DATABASES = { 'default': { ...

随机推荐

  1. ThinkPHP的url简化

    TP的url请求简化 下面是apache的配置过程,可以参考: 1.       httpd.conf 配置文件中加载了mod_rewrite.so模块 2.       AllowOverride ...

  2. Hive表的基本操作

    目录 1. 创建表 2. 拷贝表 3. 查看表结构 4. 删除表 5. 修改表 5.1 表重命名 5.2 增.修.删分区 5.3 修改列信息 5.4 增加列 5.5 删除列 5.6 修改表的属性 1. ...

  3. MySQL 标识符到底区分大小写么——官方文档告诉你

    最近在阿里云服务器上部署一个自己写的小 demo 时遇到一点问题,查看 Tomcat 日志后定位到问题出现在与数据库服务器交互的地方,执行 SQL 语句时会返回 指定列.指定名 不存在的错误.多方查证 ...

  4. 【Java基础】异常处理

    异常处理 异常概述 在 Java 语言中,将程序执行中发生的不正常情况称为"异常",但是开发过程中的语法错误和逻辑错误不是异常. 在执行过程中所发生的异常事件可分为两类: Erro ...

  5. dotnet高性能buffer

    1 前言 我曾经写过<杂谈.netcore的Buffer相关新类型>的博客,简单介绍过BinaryPrimitives.Span<>,Memory<>,ArrayP ...

  6. JavaScript入门-函数function(二)

    JavaScript入门-函数function(二) 递归函数 什么是递归函数? 递归简单理解就是,在函数体里,调用自己. //我们在求一个10的阶乘的时候,可能会这么做 //写一个循环 var to ...

  7. 【Sed】使用sed删除文件指定行的内容

    sed多看帮助文档,受益良多 sed -i '$d' filename 例如删除 /etc/profile的最后一行 cat -n /etc/profile ...    101  export PA ...

  8. 【MySQL】一台服务器上搭建两个mysql节点

    环境: CentOS 6.8  memory:1G Mysql 5.7 二进制安装包 1.安装相关的环境包 yum -y install gcc glibc libaio libstdc++ libs ...

  9. kubernets之节点和网络的安全保障策略

    一  在pod中使用宿主节点的命名空间 1.1  在pod中使用宿主的网络命名空间 [root@node01 Chapter13]# cat pod-with-host-network.yml api ...

  10. 【葵花宝典】一天掌握Docker

    第1章Docker 概述 1-1 Docker是什么 没有虚拟化技术的原始年代 我们仔细想想,在没有计算虚拟化技术的"远古"年代,如果我们要部署一个应用程序(Application ...