经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
理解Django的模型层
来源:cnblogs  作者:W的一天  时间:2019/1/3 9:39:23  对本文有异议

  一、ORM简介

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

  ORM是‘对象-关系-映射’的简称

  1. #sql中的表                                                      
  2.  
  3.  #创建表:     CREATE TABLE employee(                                     
  4.                 id INT PRIMARY KEY auto_increment ,                    
  5.                 name VARCHAR (20),                                      
  6.                 gender BIT default 1,                                  
  7.                 birthday DATA ,                                         
  8.                 department VARCHAR (20),                                
  9.                 salary DECIMAL (8,2) unsigned,                          
  10.               );  #sql中的表纪录                                                  
  11.  
  12.   #添加一条表纪录:                                                                INSERT employee (name,gender,birthday,salary,department)            
  13.              VALUES   ("alex",1,"1985-12-12",8000,"保洁部");               
  14.  
  15.   #查询一条表纪录:                                                             SELECT * FROM employee WHERE age=24;                               
  16.  
  17.   #更新一条表纪录:                                                             UPDATE employee SET birthday="1989-10-24" WHERE id=1;              
  18.  
  19.   #删除一条表纪录:                                                            DELETE FROM employee WHERE name="alex"                             #python的类class Employee(models.Model):
  20.      id=models.AutoField(primary_key=True)
  21.      name=models.CharField(max_length=32)
  22.      gender=models.BooleanField()
  23.      birthday=models.DateField()
  24.      department=models.CharField(max_length=32)
  25.      salary=models.DecimalField(max_digits=8,decimal_places=2) #python的类对象  #添加一条表纪录:  emp=Employee(name="alex",gender=True,birthday="1985-12-12",epartment="保洁部")
  26.           emp.save()      #查询一条表纪录:  Employee.objects.filter(age=24)      #更新一条表纪录:  Employee.objects.filter(id=1).update(birthday="1989-10-24")      #删除一条表纪录:  Employee.objects.filter(name="alex").delete()

View Code

  二、单表操作

  1,创建表

  1.1 创建模型,在models.py中创建

  1. from django.db import modelsclass book(models.Model):           #类名就相当于表名,当时数据库会把表名写成app名字+上类名,中间用下划线隔开,如app01_book
  2.     id=models.AutoField(primary_key=True)   #id字段名,AutoField是自增长类型,括号里面是(主键设置)
  3.     name=models.CharField(max_length=15)
  4.     price=models.DecimalField(max_digits=5,decimal_places=2)
  5.     printer=models.CharField(max_length=15)
  6.     auther=models.CharField(max_length=15)class Meta:                   #这是把表名直接设成book
  7.         db_table='book'

  1.2 字段和参数

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

字段

  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.3 settings配置

  1. DATABASES =: :::::3306               #端口默认3306

  1.4 项目下的__init__.py设置

  因为Django默认你导入的驱动是Mysqldb,但我们用的是pymysql,所以需要我们在项目下的__init__.py文件中写入:

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

  现在我们启动项目。

  1.5 输入数据库迁移指令既可在指定的库中创建表:

  1. python manage.py makemigrations
  2. 等待跑完之后输入
  3. python manage.py migrate

  此时,我们就在库里面实现了表的创建,可以在cmd查看创建的表结构

  2,添加表记录

  2.1 方式一

  1. book_obj=book(name='python',price=20)    #这相当于在实例化一个对象,我们的每一条表记录就相当于一个实例化对象
  2. book.obj.save()                          #在这种方式下,必须加上save()方法才能添加成功

  2.2方式二

  1. book_obj=book.objects.create(name='python',price=20)每一个定义的字段都要给值,自增长的不用

  3,查询表记录

  3.1 查询的方法

  1. queryset对象就是有实例化对象组成的集合,这和JQuery对象与DOM对象关系差不多
  2. <1><2> filter(**<3> get(**<4> exclude(**<5> order_by(*<6><8><9><10><11><12> values(*<13> values_list(*<14> distinct():            从返回结果中剔除重复纪录

  3.2 模糊查询

  1. Book.objects.filter(price__in=[100,200,300])    可以找出price=100,或price=200,或price=300
  2. Book.objects.filter(price__gt=100)             可以找出price>100
  3. Book.objects.filter(price__lt=100)             可以找出price<100
  4. Book.objects.filter(price__range=[100,200])    可以找出price100200之间的
  5. Book.objects.filter(title__contains="python")    可以找出title里包含‘python’的
  6. Book.objects.filter(title__icontains="python")   和上面一样,只是不区分大小写
  7. Book.objects.filter(title__startswith="py")      可以找出title里以‘py’开头的
  8. Book.objects.filter(pub_date__year=2012)         可以找出pub_date2012年的

  4,删除表记录

  首先要找到对象,不管是实例化对象(即一条表记录),还是queryset对象(即多条表记录)都可以一下全删除

  1. obj.delete()     obj可以使queryset对象,也可以是实例化对象

  5,修改表记录

  也是先要查询到对象,然后修改

  1. obj.updae(price=20)    obj可以是queryset对象,也可以是实例化对象,查出来的所有记录的price变为20

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号