Models层
模型类
继承自 django.db.models.Model
每个类属性,表现一个数据字段
嵌套Meta声明更多选项
字段类型
【通用属性】
字段选项 | 说明 |
---|---|
null=True/False | 字段是否可以为NULL,允许数据库存储值为null数据 |
blank=True/False | 是否允许空字符,该字段主要用在表单验证时使用,默认情况下blank为False 。如果数据库存储允许为null时,blank也必须设置为True(不然无法通过表单验证) |
choices=序列 | 选项列表,官方说明直达入口 choice可以是一个二元元组,也可以二元元组套二元元组 |
verbose_name | 设置便于人类阅读的名称 |
db_column | 数据列名, 未设置的情况下使用字段名作为列名 |
db_index | 是否为索引 |
default | 给字段设置默认值,可以是一个值也可以时一个可调用对象(但不能使用lambda表达式) |
unique | 是否唯一 |
unique_for_date | 组合唯一 官方说明直达 。 【个人感觉】在Meta中设置更方便:class Meta: unique_togther = [字段1 , 字段2] |
primary_key | 主键 |
error_messages | 错误消息,这个选项可以重写默认的消息提示 |
validators | 验证分内置验证和自定义验证,验证器既可以用在model层也可以用在form层。验证器会单独讲解。迫不及待的小伙伴可以 点击直达官方文档 |
【 字段类型 】
字段选项 | 说明 |
---|---|
AutoField | 整型自增长主键字段 |
BigAutoField | 2的64次方的长度, 1 to 9223372036854775807. |
UUIDField | 全局唯一标识符字段 |
BigIntegerField | -9223372036854775807 to 9223372036854775807. |
【文本】
字段选项 | 说明 |
---|---|
CharField() | 字符字段,max_legth是必选参数。如果是大段文本,可使用TextField,对应的默认form组建是TextInput |
SlugField | 短标签字段,仅包含字母,数字,下划线或连字符。可以指定max_length,如未指定 |
【数字】
字段选项 | 说明 |
---|---|
IntegerField() | – |
SmallIntegerField() | – |
BigIntegerField() | – |
PositiveIntegerField() | 必须为正整数,从0到的值2147483647 |
PositiveSmallIntegerField() | 必须为正整数,从0到的值2147483647 |
FloatField() | 浮点型 |
DecimalField(max_digits=8, decimal_places=2) | 高精度小数,max_digits表示小数点前几位,decimal_places表示小数点后几位,是必选参数。存储最多约十亿个数字,分辨率为小数点后十位 |
【选择】
字段选项 | 说明 |
---|---|
BooleanField | 布尔型字段 |
NullBolleanField | 布尔型字段 |
【日期时间】
字段选项 | 说明 |
---|---|
DateField() | 只存年月日,auto_now_add=False 每次添加时添加时间, auto_now=False 每次更新都会修改时间 |
TimeField() | 只存时分秒毫秒 |
DateTimeField() | 存年月日时分秒毫秒 |
DurationField() | 时间差 |
【网络】
字段选项 | 说明 |
---|---|
EmailField() | 电子邮件地址 |
URLField() | 资源定位符 |
GenericIPAdressField() | 可选参数protocol = IPv4 或 IPv6 或 both |
【文件和路径】
字段选项 | 说明 |
---|---|
FileField() | 文件上传字段,FileField(upload_to = None,max_length = 100,** options) |
ImageField() | 是对FileField的扩展,如果实际开发中用到该字段需安装第三方库pillow。 直达pillow文档 |
BinaryField | 存储二进制数据(将文件、图片、音视频等以二进制形式存储),官方建议最好以静态文件方式存储 |
FilePathField() |
【关系】
字段选项 | 说明 |
---|---|
一对多 ForeignKey() | .on_delete = models.CASCADE 或 models.SET_NULL 或 models.SET_DEFAULT 或 models.PROTECT 或 models.DO_NOTHING |
多对多 ManyToManyField() | |
一对一 OneToOneField() |
⚠️注意: 关系字段官方文档直达
Meta元数据(嵌套类声明更多选项)
选项 | 说明 |
---|---|
abstract = True/False | 是否允许其他类继承 |
ordering = [] | 排序字段序列。-表示降序,?表示随机 |
app_label | app_label这个选项只在一种情况下使用,就是你的模型类不在默认的应用程序包下的models.py文件中,这时候你需要指定你这个模型类是那个应用程序的。比如你在其他地方写了一个模型类,而这个模型类是属于myapp的,那么需要指定 |
base_manager_name | – |
db_table | table_name = ‘生成自定义的表名’ |
db_tablespace | 有些数据库有数据库表空间,比如Oracle。你可以通过db_tablespace来指定这个模型对应的数据库表放在哪个数据库表空间 |
default_manager_name | – |
default_related_name | – |
get_latest_by | get_latest_by = ‘最新数据排序字段’ |
managed = True | 由于Django会自动根据模型类生成映射的数据库表,如果你不希望Django这么做,可以把managed的值设置为False。默认值为True,这个选项为True时Django可以对数据库表进行 migrate或migrations、删除等操作。在这个时间Django将管理数据库中表的生命周期。如果为False的时候,不会对数据库表进行创建、删除等操作。可以用于现有表、数据库视图等,其他操作是一样的。 |
order_with_respect_to | – |
permissions | permissions主要是为了在Django Admin管理模块下使用的,如果你设置了这个属性可以让指定的方法权限描述更清晰可读 |
default_permissions | – |
proxy | – |
required_db_features | – |
required_db_vendor | – |
select_on_save | – |
indexes | 创建索引字段 |
unique_together | 创建联合唯一,但不能在ManyToMany字段上使用。 |
index_together | 创建联合索引 |
constraints | – |
verbose_name | verbose_name的意思很简单,就是给你的模型类起一个更可读的名字 |
verbose_name_plural | 这个选项是指定,模型的复数形式是什么。若未提供该选项, Django 会使用 verbose_name + “s”. |
Read-only Meta attributes | – |
label | – |
label_lower |
数据查询
执行查询
便利迭代
分割切片
缓存或序列化
通过repr()表现
通过len()统计元素数量
list()转化
bool转换
API
查询所有 —> all()
单条 —> get() —> 只能处理返回一条的
按时间查询
最新的一条 —> .latest(‘按哪个时间’)
最老的一条 —> .earliest(‘按哪个时间’)
按id查询
last()
first()
排序 order_by
order_by(“字段”)
排序后第一条 —> first()
排序后最后一条 —> last()
过滤 filter
过滤 filter(**kwargs)
__exact=’’ 严格匹配
__iexact = ‘’ 不区分大小写
__contains=’’ 包含
__startswith=’’ 以什么开头的
__endswith=’’ 以什么结尾的
__in=[’’,’’,’’] 条件满足列表某个值的
__range(start, end) 起止范围内
数值型型比较
= 等于多少的
__gt=int_number 大于多少的
__lt=int_number 小于多少的
__gte =int_number 大于等于
__lte=int_number 小于等于
日期时间比较
__year 特定年份
__month 特定月份
__day 特定日期
是否为空
__isnull=True 查询空值
匹配正则
__regex=r’这里填正则表达式’ 匹配正则
排除(查找除什么以外的)
exclude(**kwargs)
排序 order_by() 默认升序
order_by( ‘-字段’) 加“ - ”号后为降序
反转 ----> 对查询结果进行反转
QuerySet.reverse()
投影查询
.values(*field) 返回包含特定字段的dict
.values_list(*field) 返回包含特定字段的元组
.values_list(field , flat=True) 每条记录为单值而非tuple
延迟加载
.defer(*field) 指定延迟加载字段
.only(*field) 除指定字段外所有字段都延迟加载
聚合查询
.aggregate() —> 用法示例: Product.objects.aggregate(Avg(‘字段’))
django.db.models.Count —> 统计满足条件的数量
django.db.models.Avg
django.db.models.Sum
django.db.models.Max
django.db.models.Mix
…
查询注释 .annotate()
复杂条件查询
跨关系查询
多条件查询
Q()对象
同时满足条件
from django.db.models import Q【举例】Product.object.filter.(Q(过滤条件一), Q(过滤条件二))
条件“或“
from django.db.models import Q【举例】Product.object.filter.(Q(过滤条件一), Q(过滤条件二)| Q(过滤条件三))