Django 系列博客(十三)

前言

本篇博客介绍 Django 中的常用字段和参数。

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()实例。

常用和非常用字段

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=32) class Group(models.Model):
# 自定义自增列
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32) SmallIntegerField(IntegerField):
- 小整数 - 32768 ~ 32767 PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正小整数
0 ~ 32767
IntegerField(Field)
- 整数列(有符号的) - 2147483648 ~ 2147483647 PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正整数
0 ~ 2147483647 BigIntegerField(IntegerField):
- 长整型(有符号的) - 9223372036854775808 ~ 9223372036854775807 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
.2
.1
时候,可解析为192
.0
.2
.1,开启此功能,需要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)
- 二进制类型

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

ORM字段参数

null

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

unique

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

db_index

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

default

为该字段设置默认值。

auto_now_add

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

auto_now

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

具体意思

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

关系字段

ForeignKey

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

to

设置要关联的表

to_field

设置要关联的表的字段

related_name

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

publish = ForeignKey(Blog, related_name='booklist')

db_constraint

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

OneToOneField

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

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

class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField(default=18) class AuthorDetail(models.Model):
id = models.AutoField(primary_key=True)
addr = models.CharField(max_length=32)
author = models.OneToOneField(to=Author, to_field='id')

to

设置要关联的表

to_field

设置要关联的字段。

on_delete

级联删除选项

ManyToManyField

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

to

设置要关联的表

related_name

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

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 来指定第三张表的表名。

class Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish_date = models.DateField()
publish = models.ForeignKey(to='Publish', to_field='id')
authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book', 'author')) class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
gender = models.SmallIntegerField()
author_detail = models.OneToOneField(to='AuthorDetail', to_field='id', on_delete=models.CASCADE) class Book2Author(models.Model):
id = models.AutoField(primary_key=True)
book = models.ForeignKey(to=Book)
author = models.ForeignKey(to=Author)

through_field

设置要关联的字段:关联字段在Book2Author中,从这个表到Book 表,所以把 book 写在前面。

db_table

默认创建第三张表时,设置表的名字。

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

方式一:手动创建第三张表

class Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish_date = models.DateField()
publish = models.ForeignKey(to='Publish', to_field='id') class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
gender = models.SmallIntegerField()
author_detail = models.OneToOneField(to='AuthorDetail', to_field='id', on_delete=models.CASCADE) class Book2Author(models.Model):
id = models.AutoField(primary_key=True)
book = models.ForeignKey(to=Book)
author = models.ForeignKey(to=Author)

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

class Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish_date = models.DateField()
publish = models.ForeignKey(to='Publish', to_field='id')
authors = models.ManyToManyField(to='Author') class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
gender = models.SmallIntegerField()
author_detail = models.OneToOneField(to='AuthorDetail', to_field='id', on_delete=models.CASCADE)

方式三:设置 ManyToManyField 并指定手动创建第三张表

class Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish_date = models.DateField()
publish = models.ForeignKey(to='Publish', to_field='id') class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
gender = models.SmallIntegerField()
author_detail = models.OneToOneField(to='AuthorDetail', to_field='id', on_delete=models.CASCADE) class Book2Author(models.Model):
id = models.AutoField(primary_key=True)
book = models.ForeignKey(to=Book)
author = models.ForeignKey(to=Author)

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

这样创建的第三张表无法使用 set、add、remove、clear方法来管理对多多关系,需要通过第三张表来进行增、删、改,查询一样。

自定义字段

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)

Django 系列博客(十三)的更多相关文章

  1. Django 系列博客(十六)

    Django 系列博客(十六) 前言 本篇博客介绍 Django 的 forms 组件. 基本属性介绍 创建 forms 类时,主要涉及到字段和插件,字段用于对用户请求数据的验证,插件用于自动生成 h ...

  2. Django 系列博客(十四)

    Django 系列博客(十四) 前言 本篇博客介绍在 html 中使用 ajax 与后台进行数据交互. 什么是 ajax ajax(Asynchronous Javascript And XML)翻译 ...

  3. Django 系列博客(十二)

    Django 系列博客(十二) 前言 本篇博客继续介绍 Django 中的查询,分别为聚合查询和分组查询,以及 F 和 Q 查询. 聚合查询 语法:aggregate(*args, **kwargs) ...

  4. Django 系列博客(十一)

    Django 系列博客(十一) 前言 本篇博客介绍使用 ORM 来进行多表的操作,当然重点在查询方面. 创建表 实例: 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日 ...

  5. Django 系列博客(十)

    Django 系列博客(十) 前言 本篇博客介绍在 Django 中如何对数据库进行增删查改,主要为对单表进行操作. ORM简介 查询数据层次图解:如果操作 mysql,ORM 是在 pymysql ...

  6. Django 系列博客(九)

    Django 系列博客(九) 前言 本篇博客介绍 Django 模板的导入与继承以及导入导入静态文件的几种方式. 模板导入 模板导入 语法:``{% include '模板名称' %} 如下: < ...

  7. Django 系列博客(八)

    Django 系列博客(八) 前言 本篇博客介绍 Django 中的模板层,模板都是Django 使用相关函数渲染后传输给前端在显式的,为了想要渲染出我们想要的数据,需要学习模板语法,相关过滤器.标签 ...

  8. Django 系列博客(七)

    Django 系列博客(七) 前言 本篇博客介绍 Django 中的视图层中的相关参数,HttpRequest 对象.HttpResponse 对象.JsonResponse,以及视图层的两种响应方式 ...

  9. Django 系列博客(六)

    Django 系列博客(六) 前言 本篇博客介绍 Django 中的路由控制部分,一个网络请求首先到达的就是路由这部分,经过路由与视图层的映射关系再执行相应的代码逻辑并将结果返回给客户端. Djang ...

随机推荐

  1. sortable的基本属性

    所有的事件回调函数都有两个参数:event和ui,浏览器自有event对象,和经过封装的ui对象   ui.helper - 表示sortable元素的JQuery对象,通常是当前元素的克隆对象    ...

  2. 201771010118 马昕璐 《面向对象设计 java》第十七周实验总结

    1.实验目的与要求 (1) 掌握线程同步的概念及实现技术: (2) 线程综合编程练习 2.实验内容和步骤 实验1:测试程序并进行代码注释. 测试程序1: l 在Elipse环境下调试教材651页程序1 ...

  3. 4.再来看看逆向——OD的简介

    目录 1.前言 2.一些设置和配置 3.开始了解OD 代码窗口 数据窗口 小端序问题 前言 前3节主要写了恶意代码用到的手段,接下来先写一下关于逆向调试的一些内容.毕竟逆向比较难理解一点. 一些配置和 ...

  4. python elasticsearch 批量写入数据

    from elasticsearch import Elasticsearch from elasticsearch import helpers import pymysql import time ...

  5. centos7防火墙配置

    一.在工作中远程连接经常通过堡垒机连接,不能直接开启防火墙.所以就需要写入配置文件中 编译配置文件   /etc/firewalld/zones/public.xml <?xml version ...

  6. sv时序组合和时序逻辑

    input a; input b; input c; reg d; wire e; reg f; // 时序逻辑,有寄存器 always@(posedge clk)begin 'b1)begin d ...

  7. JAVA 热文

    Java技术面试篇 Javase基础面试题(1) Javase基础面试题(2) Javase基础面试题(3) Javase基础面试题(4) Javase基础面试题(5) Javaweb面试题(6) J ...

  8. [SQL]LeetCode262.行程和用户 | Trips and Users

    SQL架构 Create table If Not Exists Trips (Id )) Create table If Not Exists Users (Users_Id ), Role ENU ...

  9. [Swift]LeetCode390. 消除游戏 | Elimination Game

    There is a list of sorted integers from 1 to n. Starting from left to right, remove the first number ...

  10. 一个 Vue & Node 的全栈小项目

    约学 - 可以寻找一起自习的小伙伴的Web APP 一个基于 Vue & Node 的移动端全栈小项目 在线演示(请使用移动端查看效果) 源码地址: https://github.com/G- ...