1 ORM字段

AutoField

int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。

IntegerField

一个整数类型,范围在 -2147483648 to 2147483647。

CharField

字符类型,必须提供max_length参数, max_length表示字符长度。

DateField

日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。

DateTimeField

日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例

常用和非常用字段

常用和非常用字段合集

  1. AutoField(Field)
  2. - int自增列,必须填入参数 primary_key=True
  3. BigAutoField(AutoField)
  4. - bigint自增列,必须填入参数 primary_key=True
  5. # 注:当model中如果没有自增列,则自动会创建一个列名为id的列
  6. from django.db import models
  7. class UserInfo(models.Model):
  8. # 自动创建一个列名为id的且为自增的整数列
  9. username = models.CharField(max_length=32)
  10. class Group(models.Model):
  11. # 自定义自增列
  12. nid = models.AutoField(primary_key=True)
  13. name = models.CharField(max_length=32)
  14. SmallIntegerField(IntegerField):
  15. - 小整数 -32768 32767
  16. PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
  17. - 正小整数 0 32767
  18. IntegerField(Field)
  19. - 整数列(有符号的) -2147483648 2147483647
  20. PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
  21. - 正整数 0 2147483647
  22. BigIntegerField(IntegerField):
  23. - 长整型(有符号的) -9223372036854775808 9223372036854775807
  24. BooleanField(Field)
  25. - 布尔值类型
  26. NullBooleanField(Field):
  27. - 可以为空的布尔值
  28. CharField(Field)
  29. - 字符类型
  30. - 必须提供max_length参数, max_length表示字符长度
  31. TextField(Field)
  32. - 文本类型
  33. EmailField(CharField):
  34. - 字符串类型,Django Admin以及ModelForm中提供验证机制
  35. IPAddressField(Field)
  36. - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
  37. GenericIPAddressField(Field)
  38. - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4Ipv6
  39. - 参数:
  40. protocol,用于指定Ipv4Ipv6 'both',"ipv4","ipv6"
  41. unpack_ipv4 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"
  42. URLField(CharField)
  43. - 字符串类型,Django Admin以及ModelForm中提供验证 URL
  44. SlugField(CharField)
  45. - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
  46. CommaSeparatedIntegerField(CharField)
  47. - 字符串类型,格式必须为逗号分割的数字
  48. UUIDField(Field)
  49. - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
  50. FilePathField(Field)
  51. - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
  52. - 参数:
  53. path, 文件夹路径
  54. match=None, 正则匹配
  55. recursive=False, 递归下面的文件夹
  56. allow_files=True, 允许文件
  57. allow_folders=False, 允许文件夹
  58. FileField(Field)
  59. - 字符串,路径保存在数据库,文件上传到指定目录
  60. - 参数:
  61. upload_to = "" 上传文件的保存路径
  62. storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
  63. ImageField(FileField)
  64. - 字符串,路径保存在数据库,文件上传到指定目录
  65. - 参数:
  66. upload_to = "" 上传文件的保存路径
  67. storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
  68. width_field=None, 上传图片的高度保存的数据库字段名(字符串)
  69. height_field=None 上传图片的宽度保存的数据库字段名(字符串)
  70. DateTimeField(DateField)
  71. - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
  72. DateField(DateTimeCheckMixin, Field)
  73. - 日期格式 YYYY-MM-DD
  74. TimeField(DateTimeCheckMixin, Field)
  75. - 时间格式 HH:MM[:ss[.uuuuuu]]
  76. DurationField(Field)
  77. - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
  78. FloatField(Field)
  79. - 浮点型
  80. DecimalField(Field)
  81. - 10进制小数
  82. - 参数:
  83. max_digits,小数总长度
  84. decimal_places,小数位长度
  85. BinaryField(Field)
  86. - 二进制类型

ORM字段与数据库实际字段的对应关系

  1. # 对应关系:
  2. 'AutoField': 'integer AUTO_INCREMENT',
  3. 'BigAutoField': 'bigint AUTO_INCREMENT',
  4. 'BinaryField': 'longblob',
  5. 'BooleanField': 'bool',
  6. 'CharField': 'varchar(%(max_length)s)',
  7. 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
  8. 'DateField': 'date',
  9. 'DateTimeField': 'datetime',
  10. 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
  11. 'DurationField': 'bigint',
  12. 'FileField': 'varchar(%(max_length)s)',
  13. 'FilePathField': 'varchar(%(max_length)s)',
  14. 'FloatField': 'double precision',
  15. 'IntegerField': 'integer',
  16. 'BigIntegerField': 'bigint',
  17. 'IPAddressField': 'char(15)',
  18. 'GenericIPAddressField': 'char(39)',
  19. 'NullBooleanField': 'bool',
  20. 'OneToOneField': 'integer',
  21. 'PositiveIntegerField': 'integer UNSIGNED',
  22. 'PositiveSmallIntegerField': 'smallint UNSIGNED',
  23. 'SlugField': 'varchar(%(max_length)s)',
  24. 'SmallIntegerField': 'smallint',
  25. 'TextField': 'longtext',
  26. 'TimeField': 'time',
  27. 'UUIDField': 'char(32)'

2 ORM字段参数

null

用于表示某个字段可以为空。

unique

如果设置为unique=True 则该字段在此表中必须是唯一的 。

db_index

如果db_index=True 则代表着为此字段设置索引。

default

为该字段设置默认值。

DateField和DateTimeField

auto_now_add

配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。

auto_now

配置上auto_now=True,每次更新数据记录的时候会更新该字段。

了解一下

  1. null 数据库中字段是否可以为空
  2. db_column 数据库中字段的列名
  3. db_tablespace
  4. default 数据库中字段的默认值
  5. primary_key 数据库中字段是否为主键
  6. db_index 数据库中字段是否可以建立索引
  7. unique 数据库中字段是否可以建立唯一索引
  8. unique_for_date 数据库中字段【日期】部分是否可以建立唯一索引
  9. unique_for_month 数据库中字段【月】部分是否可以建立唯一索引
  10. unique_for_year 数据库中字段【年】部分是否可以建立唯一索引
  11. verbose_name Admin中显示的字段名称
  12. blank Admin中是否允许用户输入为空
  13. editable Admin中是否可以编辑
  14. help_text Admin中该字段的提示信息
  15. choices Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
  16. 如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
  17. error_messages 自定义错误信息(字典类型),从而定制想要显示的错误信息;
  18. 字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
  19. 如:{'null': "不能为空.", 'invalid': '格式错误'}
  20. validators 自定义错误验证(列表类型),从而定制想要的验证规则
  21. from django.core.validators import RegexValidator
  22. from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\
  23. MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
  24. 如:
  25. test = models.CharField(
  26. max_length=32,
  27. error_messages={
  28. 'c1': '优先错信息1',
  29. 'c2': '优先错信息2',
  30. 'c3': '优先错信息3',
  31. },
  32. validators=[
  33. RegexValidator(regex='root_\d+', message='错误了', code='c1'),
  34. RegexValidator(regex='root_112233\d+', message='又错误了', code='c2'),
  35. EmailValidator(message='又错误了', code='c3'), ]
  36. )

3 关系字段

ForeignKey

外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。

ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。

to

设置要关联的表

to_field

设置要关联的表的字段

related_name

反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。

例如:

  1. class Classes(models.Model):
  2. name = models.CharField(max_length=32)
  3. class Student(models.Model):
  4. name = models.CharField(max_length=32)
  5. theclass = models.ForeignKey(to="Classes")

当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:

  1. models.Classes.objects.first().student_set.all()

当我们在ForeignKey字段中添加了参数 related_name 后

  1. class Student(models.Model):
  2. name = models.CharField(max_length=32)
  3. theclass = models.ForeignKey(to="Classes", related_name="students")

当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:

  1. models.Classes.objects.first().students.all()

related_query_name

反向查询操作时,使用的连接前缀,用于替换表名。

on_delete

  当删除关联表中的数据时,当前表与其关联的行的行为。

  models.CASCADE

  删除关联数据,与之关联也删除

  models.DO_NOTHING

  删除关联数据,引发错误IntegrityError

  models.PROTECT

  删除关联数据,引发错误ProtectedError

  models.SET_NULL

  删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)

  models.SET_DEFAULT

  删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)

  models.SET

  删除关联数据,

  a. 与之关联的值设置为指定值,设置:models.SET(值)

  b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

  1. def func():
  2. return 10
  3. class MyModel(models.Model):
  4. user = models.ForeignKey(
  5. to="User",
  6. to_field="id"
  7. on_delete=models.SET(func)
  8. )

db_constraint

是否在数据库中创建外键约束,默认为True。

OneToOneField

一对一字段。

通常一对一字段用来扩展已有字段。

一对一的关联关系多用在当一张表的不同字段查询频次差距过大的情况下,将本可以存储在一张表的字段拆开放置在两张表中,然后将两张表建立一对一的关联关系。

  1. class Author(models.Model):
  2. name = models.CharField(max_length=32)
  3. info = models.OneToOneField(to='AuthorInfo')
  4. class AuthorInfo(models.Model):
  5. phone = models.CharField(max_length=11)
  6. email = models.EmailField()

to

设置要关联的表。

to_field

设置要关联的字段。

on_delete

同ForeignKey字段。

ManyToManyField

用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系

to

设置要关联的表

related_name

同ForeignKey字段。

related_query_name

同ForeignKey字段。

symmetrical

仅用于多对多自关联时,指定内部是否创建反向操作的字段。默认为True。

举个例子:

  1. class Person(models.Model):
  2. name = models.CharField(max_length=16)
  3. friends = models.ManyToManyField("self")

此时,person对象就没有person_set属性。

  1. class Person(models.Model):
  2. name = models.CharField(max_length=16)
  3. friends = models.ManyToManyField("self", symmetrical=False)

此时,person对象现在就可以使用person_set属性进行反向查询。

through

在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。

但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名。

through_fields

设置关联的字段。

db_table

默认创建第三张表时,数据库中表的名称。

4 多对多关联关系的三种方式

方式一:自行创建第三张表

  1. class Book(models.Model):
  2. title = models.CharField(max_length=32, verbose_name="书名")
  3. class Author(models.Model):
  4. name = models.CharField(max_length=32, verbose_name="作者姓名")
  5. # 自己创建第三张表,分别通过外键关联书和作者
  6. class Author2Book(models.Model):
  7. author = models.ForeignKey(to="Author")
  8. book = models.ForeignKey(to="Book")
  9. class Meta:
  10. unique_together = ("author", "book")

方式二:通过ManyToManyField自动创建第三张表

  1. class Book(models.Model):
  2. title = models.CharField(max_length=32, verbose_name="书名")
  3. # 通过ORM自带的ManyToManyField自动创建第三张表
  4. class Author(models.Model):
  5. name = models.CharField(max_length=32, verbose_name="作者姓名")
  6. books = models.ManyToManyField(to="Book", related_name="authors")

方式三:设置ManyTomanyField并指定自行创建的第三张表

  1. class Book(models.Model):
  2. title = models.CharField(max_length=32, verbose_name="书名")
  3. # 自己创建第三张表,并通过ManyToManyField指定关联
  4. class Author(models.Model):
  5. name = models.CharField(max_length=32, verbose_name="作者姓名")
  6. books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book"))
  7. # through_fields接受一个2元组('field1','field2'):
  8. # 其中field1是定义ManyToManyField的模型外键的名(author),field2是关联目标模型(book)的外键名。
  9. class Author2Book(models.Model):
  10. author = models.ForeignKey(to="Author")
  11. book = models.ForeignKey(to="Book")
  12. class Meta:
  13. unique_together = ("author", "book")

注意:

当我们需要在第三张关系表中存储额外的字段时,就要使用第三种方式。

但是当我们使用第三种方式创建多对多关联关系时,就无法使用set、add、remove、clear方法来管理多对多的关系了,需要通过第三张表的model来管理多对多关系。

5 元信息

ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。主要字段如下:

db_table

ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名。

index_together

联合索引。

unique_together

联合唯一索引。

ordering

指定默认按什么字段排序。

只有设置了该属性,我们查询到的结果才可以被reverse()。

了解

  1. class UserInfo(models.Model):
  2. nid = models.AutoField(primary_key=True)
  3. username = models.CharField(max_length=32)
  4. class Meta:
  5. # 数据库中生成的表名称 默认 app名称 + 下划线 + 类名
  6. db_table = "table_name"
  7. # 联合索引
  8. index_together = [
  9. ("pub_date", "deadline"),
  10. ]
  11. # 联合唯一索引
  12. unique_together = (("driver", "restaurant"),)
  13. ordering = ('name',)
  14. # admin中显示的表名称
  15. verbose_name='哈哈'
  16. # verbose_name加s
  17. verbose_name_plural=verbose_name

6 自定义字段(了解)

自定义char类型字段:

  1. class FixedCharField(models.Field):
  2. """
  3. 自定义的char类型的字段类
  4. """
  5. def __init__(self, max_length, *args, **kwargs):
  6. self.max_length = max_length
  7. super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)
  8. def db_type(self, connection):
  9. """
  10. 限定生成数据库表的字段类型为char,长度为max_length指定的值
  11. """
  12. return 'char(%s)' % self.max_length
  13. class Class(models.Model):
  14. id = models.AutoField(primary_key=True)
  15. title = models.CharField(max_length=25)
  16. # 使用自定义的char类型的字段
  17. cname = FixedCharField(max_length=25)

8、Django之模型层第三篇:更多字段与参数的更多相关文章

  1. 9、Django之模型层第四篇:进阶操作

    一 QuerySet对象 1.1可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. Entry.objects.all()[:5] # ...

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

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

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

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

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

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

  5. 【Django】模型层说明

    [Django模型层] 之前大概介绍Django的文章居然写了两篇..这篇是重点关注了Django的模型层来进行学习. ■ 模型定义 众所周知,Django中的模型定义就是定义一个类,其基本结构是这样 ...

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

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

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

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

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

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

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

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

随机推荐

  1. 上海hande

    HZero UI 一个服务于企业级产品的设计体系,基于『确定』和『自然』的设计价值观和模块化的解决方案,让设计者专注于更好的用户体验. Choerodon UI of React Choerodon ...

  2. 利用 Python 插入 Oracle 数据

    # coding=utf-8 ''''' Created on 2020-01-05 @author: Mr. Zheng ''' import json; import urllib2 import ...

  3. Centos7系统下Docker开启认证的远程端口2376配置教程

    docker开启2375会存在安全漏洞 暴露了2375端口的Docker主机.因为没有任何加密和认证过程,知道了主机IP以后,,任何人都可以管理这台主机上的容器和镜像,以前贪图方便,只开启了没有认证的 ...

  4. 吐血分享一款免费看所有付费影视的app,不好用来石欠我

    前言 朋友经常找我要各种付费影视资源,在下逛遍各大网站,终于找到一款app,那简直是神器啊. 几乎各大主流平台的付费影视都能观看,亲测有效.还在浏览器一个一个搜资源而费劲?? 还在为只买了一个平台的V ...

  5. git的项目完整操作

    今天来说下项目中git 的使用,针对常规操作: 然后执行  git status  可以看到目前的状态: 再执行添加操作      git add . 添加所有文件 接着执行提交命令  git com ...

  6. docker容器命令2

    docker容器命令2 启动守护式容器 docker run -d 镜像名字 [root@tzh ~]# docker images REPOSITORY TAG IMAGE ID CREATED S ...

  7. Linux设备驱动中的阻塞和非阻塞I/O <转载>

    Green 博客园 首页 新随笔 联系 订阅 管理 Linux设备驱动中的阻塞和非阻塞I/O   [基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件 ...

  8. coder初入职场必备:Eclipse+Tomcat8+MAVEN+SVN 工作环境搭建

    1.JDK的安装 首先下载JDK,这个从sun公司官网可以下载,根据自己的系统选择64位还是32位,安装过程就是next一路到底.安装完成之后当然要配置环境变量了. ----------------- ...

  9. Rust之路(1)

    [未经书面许可,严禁转载]-- 2020-10-09 -- 正式开始Rust学习之路了! 思而不学则罔,学而不思则殆.边学边练才能快速上手,让我们先来个Hello World! 但前提是有Rust环境 ...

  10. .net core中的那些常用的日志框架(Serilog篇)

    前言 上文说到Nlog日志框架,感觉它功能已经很强大,今天给大家介绍一个很不错的日志框架Serilog,根据我的了解,感觉它最大的优势是,结构化日志,它输出的日志是Json的格式,如果你使用的是Mon ...