Django中的ORM

Django项目使用MySQL数据库

1. 在Django项目的settings.py文件中,配置数据库连接信息:

  1. DATABASES = {
  2. "default": {
  3. "ENGINE": "django.db.backends.mysql",
  4. "NAME": "你的数据库名称", # 需要自己手动创建数据库
  5. "USER": "数据库用户名",
  6. "PASSWORD": "数据库密码",
  7. "HOST": "数据库IP",
  8. "POST": 3306
  9. }
  10. }

2. 在Django项目的__init__.py文件中写如下代码,告诉Django使用pymysql模块连接MySQL数据库:

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

Model

在Django中model是你数据的单一、明确的信息来源。它包含了你存储的数据的重要字段和行为。通常,一个模型(model)映射到一个数据库表,

基本情况:

  1. 每个模型都是一个Python类,它是django.db.models.Model的子类。
  2. 模型的每个属性都代表一个数据库字段。
  3. 综上所述,Django为您提供了一个自动生成的数据库访问API

详询官方文档链接

快速入门

下面这个例子定义了一个 Person 模型,包含 first_name 和 last_name

  1. from django.db import models
  2.  
  3. class Person(models.Model):
  4. first_name = models.CharField(max_length=30)
  5. last_name = models.CharField(max_length=30)

first_name 和 last_name 是模型的字段。每个字段被指定为一个类属性,每个属性映射到一个数据库列。

上面的 Person 模型将会像这样创建一个数据库表:

  1. CREATE TABLE myapp_person (
  2. "id" serial NOT NULL PRIMARY KEY,
  3. "first_name" varchar(30) NOT NULL,
  4. "last_name" varchar(30) NOT NULL
  5. );

一些说明:

  • 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时。
  • id字段是自动添加的,如果你想要指定自定义主键,只需在其中一个字段中指定 primary_key=True 即可。如果Django发现你已经明确地设置了Field.primary_key,它将不会添加自动ID列。
  • 本示例中的CREATE TABLE SQL使用PostgreSQL语法进行格式化,但值得注意的是,Django会根据配置文件中指定的数据库后端类型来生成相应的SQL语句。
  • Django支持MySQL5.5及更高版本。

Django ORM 常用字段和参数

常用字段

AutoField
  1. int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。
IntegerField
  1. 一个整数类型,范围在 - to
CharField
  1. 字符类型,必须提供max_length参数, max_length表示字符长度。
DateField
  1. 日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。
DateTimeField
  1. 日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。

字段合集(争取记忆)

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

自定义字段(了解为主)

  1. class UnsignedIntegerField(models.IntegerField):
  2. def db_type(self, connection):
  3. return 'integer UNSIGNED'

自定义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.  
  9. def db_type(self, connection):
  10. """
  11. 限定生成数据库表的字段类型为char,长度为max_length指定的值
  12. """
  13. return 'char(%s)' % self.max_length
  14.  
  15. class Class(models.Model):
  16. id = models.AutoField(primary_key=True)
  17. title = models.CharField(max_length=25)
  18. # 使用自定义的char类型的字段
  19. cname = FixedCharField(max_length=25)

创建的表结构:

附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)',

对应关系

字段参数

null

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

unique

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

db_index

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

default

  1. 为该字段设置默认值。

DateField和DateTimeField

auto_now_add

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

auto_now

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

关系字段

ForeignKey

  1. 外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多''多'的一方。
  2.  
  3. ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。

字段参数

to
  1. 设置要关联的表
to_field
  1. 设置要关联的表的字段
related_name
  1. 反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'

例如:

  1. class Classes(models.Model):
  2. name = models.CharField(max_length=32)
  3.  
  4. class Student(models.Model):
  5. name = models.CharField(max_length=32)
  6. 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.  
  4. class MyModel(models.Model):
  5. user = models.ForeignKey(
  6. to="User",
  7. to_field="id"
  8. on_delete=models.SET(func)
  9. )
db_constraint

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

OneToOneField

一对一字段。

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

字段参数

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

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

元信息

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

db_table

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

index_together

联合索引。

unique_together

联合唯一索引。

ordering

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

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

ORM常用字段介绍的更多相关文章

  1. Django中ORM常用字段及字段参数

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  2. Django orm常用字段和字段参数

    1.Object Relational Mapping(ORM) 1.1ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象 ...

  3. Django ORM 常用字段和参数

    Django ORM 常用字段和参数 一:常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. I ...

  4. ORM常用字段和参数

    目录: ORM常用字段和参数

  5. Django(ORM常用字段)

    day68 参考:http://www.cnblogs.com/liwenzhou/p/8688919.html 1. Django ORM常用字段:             1. AutoField ...

  6. Django框架 之 ORM 常用字段和参数

    Django框架 之 ORM 常用字段和参数 浏览目录 常用字段 字段合集 自定义字段 字段参数 DateField和DateTimeField 关系字段 ForeignKey OneToOneFie ...

  7. Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段

    单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...

  8. python 之 Django框架(ORM常用字段和字段参数、关系字段和和字段参数)

    12.324 Django ORM常用字段 .id = models.AutoField(primary_key=True):int自增列,必须填入参数 primary_key=True.当model ...

  9. Python--day68--Django ORM常用字段、不常用的字段、自定义字段

    ORM和数据库的对应关系: Django ORM 常用字段和参数 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建 ...

随机推荐

  1. 第三章 C#程序结构(3.1 顺序与选择结构)

    [案例]输入某一学生的成绩,输出其对应的档次.具体规定:90分以上为优秀,80分以上至89分为良好,70分至79分为一般,60分至69分为合格,59以下为不及格.如果输入的分数小于0或大于100,则输 ...

  2. selenium基础用法(爬虫)

    初识selenium selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏 ...

  3. 收藏Dotnetbar的官方学习链接

    Archive for the DotNetBar for Windows Forms Category: http://www.devcomponents.com/kb2/?cat=3 视频教程: ...

  4. new 对象时的暗执行顺序

    为什么称为暗执行顺序,因为当我们在new 对象时,其不是简简单单的new一个完事,它要首先检查父类的,静态的,非静态的等代码,就好像我们结婚生孩子一样,要先到祖宗那里,公安局那里,左邻右舍那里,告诉他 ...

  5. 算法实践--最长递增子序列(Longest Increasing Subsquence)

    什么是最长递增子序列(Longest Increasing Subsquence) 对于一个序列{3, 2, 6, 4, 5, 1},它包含很多递增子序列{3, 6}, {2,6}, {2, 4, 5 ...

  6. 数据库SQL语言学习----左外连接,右外连接,外连接,自然连接的形象对比

    现在有两张表,一张Student 另一张Score   1.查询每个学生及其选修课程的情况: 自然连接,Sno在Cscore中找不到就不显示,Cno在Cscore中找不到也不显示 SELECT Stu ...

  7. [UE4]Button

    一.按钮有4种状态:Normal(普通状态).Hovered(鼠标悬停状态).Pressed(鼠标按下状态).Disabled(禁用状态),可以分别给每种状态设置样式. 二.按钮有如图所示的5个事件, ...

  8. centos 设置中文环境

    方法1: [hl@localhost ~]$ LANG=zh_CN.UTF-8 #只对当前shell有效,临时设置 [hl@localhost ~]$ ll 总用量 drwxrwxr-x. hl hl ...

  9. 基于Dubbo框架构建分布式服务(集群容错&负载均衡)

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...

  10. uva-10245-分治

    题意:数组二维空间内的点,求最近的俩个点的距离. 根据x排序,求左部分的最近距离,右部分最近距离,然后以中点,当前距离为半径,计算所有的点距离. #include <string> #in ...