ORM常用字段介绍
Django中的ORM
Django项目使用MySQL数据库
1. 在Django项目的settings.py文件中,配置数据库连接信息:
- DATABASES = {
- "default": {
- "ENGINE": "django.db.backends.mysql",
- "NAME": "你的数据库名称", # 需要自己手动创建数据库
- "USER": "数据库用户名",
- "PASSWORD": "数据库密码",
- "HOST": "数据库IP",
- "POST": 3306
- }
- }
2. 在Django项目的__init__.py文件中写如下代码,告诉Django使用pymysql模块连接MySQL数据库:
- import pymysql
- pymysql.install_as_MySQLdb()
Model
在Django中model是你数据的单一、明确的信息来源。它包含了你存储的数据的重要字段和行为。通常,一个模型(model)映射到一个数据库表,
基本情况:
- 每个模型都是一个Python类,它是django.db.models.Model的子类。
- 模型的每个属性都代表一个数据库字段。
- 综上所述,Django为您提供了一个自动生成的数据库访问API
详询官方文档链接。
快速入门
下面这个例子定义了一个 Person 模型,包含 first_name 和 last_name。
- from django.db import models
- class Person(models.Model):
- first_name = models.CharField(max_length=30)
- last_name = models.CharField(max_length=30)
first_name 和 last_name 是模型的字段。每个字段被指定为一个类属性,每个属性映射到一个数据库列。
上面的 Person 模型将会像这样创建一个数据库表:
- CREATE TABLE myapp_person (
- "id" serial NOT NULL PRIMARY KEY,
- "first_name" varchar(30) NOT NULL,
- "last_name" varchar(30) NOT NULL
- );
一些说明:
- 表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
- int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。
IntegerField
- 一个整数类型,范围在 - to 。
CharField
- 字符类型,必须提供max_length参数, max_length表示字符长度。
DateField
- 日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。
DateTimeField
- 日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。
字段合集(争取记忆)
- AutoField(Field)
- - int自增列,必须填入参数 primary_key=True
- BigAutoField(AutoField)
- - bigint自增列,必须填入参数 primary_key=True
- 注:当model中如果没有自增列,则自动会创建一个列名为id的列
- from django.db import models
- class UserInfo(models.Model):
- # 自动创建一个列名为id的且为自增的整数列
- username = models.CharField(max_length=)
- class Group(models.Model):
- # 自定义自增列
- nid = models.AutoField(primary_key=True)
- name = models.CharField(max_length=)
- SmallIntegerField(IntegerField):
- - 小整数 - ~
- PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- - 正小整数 ~
- IntegerField(Field)
- - 整数列(有符号的) - ~
- PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- - 正整数 ~
- BigIntegerField(IntegerField):
- - 长整型(有符号的) - ~
- BooleanField(Field)
- - 布尔值类型
- NullBooleanField(Field):
- - 可以为空的布尔值
- CharField(Field)
- - 字符类型
- - 必须提供max_length参数, max_length表示字符长度
- TextField(Field)
- - 文本类型
- EmailField(CharField):
- - 字符串类型,Django Admin以及ModelForm中提供验证机制
- IPAddressField(Field)
- - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
- GenericIPAddressField(Field)
- - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
- - 参数:
- protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
- unpack_ipv4, 如果指定为True,则输入::ffff:192.0..1时候,可解析为192.0.2.,开启此功能,需要protocol="both"
- URLField(CharField)
- - 字符串类型,Django Admin以及ModelForm中提供验证 URL
- SlugField(CharField)
- - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
- CommaSeparatedIntegerField(CharField)
- - 字符串类型,格式必须为逗号分割的数字
- UUIDField(Field)
- - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
- FilePathField(Field)
- - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
- - 参数:
- path, 文件夹路径
- match=None, 正则匹配
- recursive=False, 递归下面的文件夹
- allow_files=True, 允许文件
- allow_folders=False, 允许文件夹
- FileField(Field)
- - 字符串,路径保存在数据库,文件上传到指定目录
- - 参数:
- upload_to = "" 上传文件的保存路径
- storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
- ImageField(FileField)
- - 字符串,路径保存在数据库,文件上传到指定目录
- - 参数:
- upload_to = "" 上传文件的保存路径
- storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
- width_field=None, 上传图片的高度保存的数据库字段名(字符串)
- height_field=None 上传图片的宽度保存的数据库字段名(字符串)
- DateTimeField(DateField)
- - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
- DateField(DateTimeCheckMixin, Field)
- - 日期格式 YYYY-MM-DD
- TimeField(DateTimeCheckMixin, Field)
- - 时间格式 HH:MM[:ss[.uuuuuu]]
- DurationField(Field)
- - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
- FloatField(Field)
- - 浮点型
- DecimalField(Field)
- - 10进制小数
- - 参数:
- max_digits,小数总长度
- decimal_places,小数位长度
- BinaryField(Field)
- - 二进制类型
自定义字段(了解为主)
- class UnsignedIntegerField(models.IntegerField):
- def db_type(self, connection):
- return 'integer UNSIGNED'
自定义char类型字段:
- class FixedCharField(models.Field):
- """
- 自定义的char类型的字段类
- """
- def __init__(self, max_length, *args, **kwargs):
- self.max_length = max_length
- super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)
- def db_type(self, connection):
- """
- 限定生成数据库表的字段类型为char,长度为max_length指定的值
- """
- return 'char(%s)' % self.max_length
- class Class(models.Model):
- id = models.AutoField(primary_key=True)
- title = models.CharField(max_length=25)
- # 使用自定义的char类型的字段
- cname = FixedCharField(max_length=25)
创建的表结构:
附ORM字段与数据库实际字段的对应关系
- 对应关系:
- 'AutoField': 'integer AUTO_INCREMENT',
- 'BigAutoField': 'bigint AUTO_INCREMENT',
- 'BinaryField': 'longblob',
- 'BooleanField': 'bool',
- 'CharField': 'varchar(%(max_length)s)',
- 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
- 'DateField': 'date',
- 'DateTimeField': 'datetime',
- 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
- 'DurationField': 'bigint',
- 'FileField': 'varchar(%(max_length)s)',
- 'FilePathField': 'varchar(%(max_length)s)',
- 'FloatField': 'double precision',
- 'IntegerField': 'integer',
- 'BigIntegerField': 'bigint',
- 'IPAddressField': 'char(15)',
- 'GenericIPAddressField': 'char(39)',
- 'NullBooleanField': 'bool',
- 'OneToOneField': 'integer',
- 'PositiveIntegerField': 'integer UNSIGNED',
- 'PositiveSmallIntegerField': 'smallint UNSIGNED',
- 'SlugField': 'varchar(%(max_length)s)',
- 'SmallIntegerField': 'smallint',
- 'TextField': 'longtext',
- 'TimeField': 'time',
- 'UUIDField': 'char(32)',
对应关系
字段参数
null
- 用于表示某个字段可以为空。
unique
- 如果设置为unique=True 则该字段在此表中必须是唯一的
db_index
- 如果db_index=True 则代表着为此字段设置索引。
default
- 为该字段设置默认值。
DateField和DateTimeField
auto_now_add
配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
auto_now
配置上auto_now=True,每次更新数据记录的时候会更新该字段。
关系字段
ForeignKey
- 外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。
- ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。
字段参数
to
- 设置要关联的表
to_field
- 设置要关联的表的字段
related_name
- 反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。
例如:
- class Classes(models.Model):
- name = models.CharField(max_length=32)
- class Student(models.Model):
- name = models.CharField(max_length=32)
- theclass = models.ForeignKey(to="Classes")
当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:
- models.Classes.objects.first().student_set.all()
当我们在ForeignKey字段中添加了参数 related_name 后,
- class Student(models.Model):
- name = models.CharField(max_length=32)
- theclass = models.ForeignKey(to="Classes", related_name="students")
当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:
- 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(可执行对象)
- def func():
- return 10
- class MyModel(models.Model):
- user = models.ForeignKey(
- to="User",
- to_field="id",
- on_delete=models.SET(func)
- )
db_constraint
是否在数据库中创建外键约束,默认为True。
OneToOneField
一对一字段。
通常一对一字段用来扩展已有字段。
字段参数
to
设置要关联的表。
to_field
设置要关联的字段。
on_delete
同ForeignKey字段。
ManyToManyField
用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系。
字段参数
to
设置要关联的表
related_name
同ForeignKey字段。
related_query_name
同ForeignKey字段。
symmetrical
仅用于多对多自关联时,指定内部是否创建反向操作的字段。默认为True。
举个例子:
- class Person(models.Model):
- name = models.CharField(max_length=16)
- friends = models.ManyToManyField("self")
此时,person对象就没有person_set属性。
- class Person(models.Model):
- name = models.CharField(max_length=16)
- 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常用字段介绍的更多相关文章
- Django中ORM常用字段及字段参数
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
- Django orm常用字段和字段参数
1.Object Relational Mapping(ORM) 1.1ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象 ...
- Django ORM 常用字段和参数
Django ORM 常用字段和参数 一:常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. I ...
- ORM常用字段和参数
目录: ORM常用字段和参数
- Django(ORM常用字段)
day68 参考:http://www.cnblogs.com/liwenzhou/p/8688919.html 1. Django ORM常用字段: 1. AutoField ...
- Django框架 之 ORM 常用字段和参数
Django框架 之 ORM 常用字段和参数 浏览目录 常用字段 字段合集 自定义字段 字段参数 DateField和DateTimeField 关系字段 ForeignKey OneToOneFie ...
- Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段
单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...
- python 之 Django框架(ORM常用字段和字段参数、关系字段和和字段参数)
12.324 Django ORM常用字段 .id = models.AutoField(primary_key=True):int自增列,必须填入参数 primary_key=True.当model ...
- Python--day68--Django ORM常用字段、不常用的字段、自定义字段
ORM和数据库的对应关系: Django ORM 常用字段和参数 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建 ...
随机推荐
- 第三章 C#程序结构(3.1 顺序与选择结构)
[案例]输入某一学生的成绩,输出其对应的档次.具体规定:90分以上为优秀,80分以上至89分为良好,70分至79分为一般,60分至69分为合格,59以下为不及格.如果输入的分数小于0或大于100,则输 ...
- selenium基础用法(爬虫)
初识selenium selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏 ...
- 收藏Dotnetbar的官方学习链接
Archive for the DotNetBar for Windows Forms Category: http://www.devcomponents.com/kb2/?cat=3 视频教程: ...
- new 对象时的暗执行顺序
为什么称为暗执行顺序,因为当我们在new 对象时,其不是简简单单的new一个完事,它要首先检查父类的,静态的,非静态的等代码,就好像我们结婚生孩子一样,要先到祖宗那里,公安局那里,左邻右舍那里,告诉他 ...
- 算法实践--最长递增子序列(Longest Increasing Subsquence)
什么是最长递增子序列(Longest Increasing Subsquence) 对于一个序列{3, 2, 6, 4, 5, 1},它包含很多递增子序列{3, 6}, {2,6}, {2, 4, 5 ...
- 数据库SQL语言学习----左外连接,右外连接,外连接,自然连接的形象对比
现在有两张表,一张Student 另一张Score 1.查询每个学生及其选修课程的情况: 自然连接,Sno在Cscore中找不到就不显示,Cno在Cscore中找不到也不显示 SELECT Stu ...
- [UE4]Button
一.按钮有4种状态:Normal(普通状态).Hovered(鼠标悬停状态).Pressed(鼠标按下状态).Disabled(禁用状态),可以分别给每种状态设置样式. 二.按钮有如图所示的5个事件, ...
- centos 设置中文环境
方法1: [hl@localhost ~]$ LANG=zh_CN.UTF-8 #只对当前shell有效,临时设置 [hl@localhost ~]$ ll 总用量 drwxrwxr-x. hl hl ...
- 基于Dubbo框架构建分布式服务(集群容错&负载均衡)
Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...
- uva-10245-分治
题意:数组二维空间内的点,求最近的俩个点的距离. 根据x排序,求左部分的最近距离,右部分最近距离,然后以中点,当前距离为半径,计算所有的点距离. #include <string> #in ...