Django学习之操作数据库
操作数据库——模型常用Field及参数
一、常用字段类型Field
字段类型 | 描述 | 数据库映射类型 |
---|---|---|
AutoField | 自动增长的整数主键 | int |
BigAutoField | 64位自动增长的整数主键 | bigint |
BooleanField | 存储布尔值(True/False) | tinyint |
CharField | 固定长度字符串,需指定max_length | varchar |
DateField | 日期类型 | date |
DateTimeField | 日期时间类型 | datetime |
TimeField | 时间类型 | time |
EmailField | 验证电子邮件格式的字符串,最大长度默认为254 | varchar(254) |
FileField | 文件上传字段 | varchar |
ImageField | 图像文件上传字段 | varchar |
FloatField | 浮点数 | float |
IntegerField | 整数 | int |
BigIntegerField | 大整数 | bigint |
PositiveIntegerField | 正整数(0到2147483647) | int |
SmallIntegerField | 小整数(-32768到32767) | smallint |
PositiveSmallIntegerField | 正小整数(0到32767) | smallint |
TextField | 大量文本数据 | longtext |
UUIDField | 存储UUID格式的字符串 | char(32) |
URLField | 存储URL地址,默认最大长度200 | varchar(200) |
二、Field的常用参数
参数名称 | 描述 | 示例 |
---|---|---|
null | 是否允许数据库级别为空 | null=True |
blank | 是否允许表单验证时为空 | blank=True |
db_column | 指定数据库中的列名 | db_column='custom_name' |
default | 设置字段的默认值 | default=0 或 default='N/A' |
primary_key | 是否为主键 | primary_key=True |
unique | 确保该字段在整个表中的值唯一 | unique=True |
choices | 提供一个选项列表来限制字段的取值范围 | choices=[('M', 'Male'), ('F', 'Female')] |
help_text | 在表单控件旁边显示的帮助文本 | help_text="Enter your name" |
verbose_name | 更友好的字段名称,在管理界面中使用 | verbose_name="First Name" |
validators | 字段值的验证函数列表 | validators=[validate_even] |
editable | 是否在表单或管理界面中可编辑 | editable=False |
error_messages | 自定义错误消息 | error_messages={'required': 'This field is required.'} |
auto_now | 每次保存对象时自动设置当前日期(仅适用于DateField和DateTimeField) | auto_now=True |
auto_now_add | 第一次创建对象时自动设置当前日期(仅适用于DateField和DateTimeField) | auto_now_add=True |
示例:
# models.py
from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator
class Book(models.Model):
# 主键使用BigAutoField
id = models.BigAutoField(primary_key=True)
# 书名,CharField需要指定max_length
title = models.CharField(max_length=200, verbose_name="书名", help_text="请输入书名")
# 作者,CharField同样需要指定max_length
author = models.CharField(max_length=100, blank=True, null=True, db_column='writer', verbose_name="作者")
# 出版日期,DateField
pub_date = models.DateField(auto_now_add=False, auto_now=False, null=True, blank=True, verbose_name="出版日期")
# 价格,FloatField并设置最小值和最大值验证器
price = models.FloatField(default=0.0, validators=[MinValueValidator(0), MaxValueValidator(1000)], verbose_name="价格")
# 是否推荐,BooleanField
is_recommended = models.BooleanField(default=False, verbose_name="是否推荐")
# 描述,TextField用于长文本
description = models.TextField(blank=True, null=True, verbose_name="描述")
# 评分,PositiveSmallIntegerField,限定范围为0-5
rating = models.PositiveSmallIntegerField(default=3, validators=[MinValueValidator(0), MaxValueValidator(5)], verbose_name="评分")
# 封面图片,ImageField,上传到'media/books/covers/'目录下
cover_image = models.ImageField(upload_to='books/covers/', blank=True, null=True, verbose_name="封面图片")
# ISBN号,CharField,唯一且默认为空字符串
isbn = models.CharField(max_length=13, unique=True, default='', verbose_name="ISBN号")
三、模型中的Meta类配置
在Django模型中,Meta类用于定义模型级别的配置选项。通过在模型内部定义一个名为Meta的内部类,可以设置一系列模型级别的选项,从而定制模型的行为和表现形式。
常用Meta
类配置选项:
配置选项 | 描述 | 示例 |
---|---|---|
db_table | 指定该模型对应的数据库表名。 | db_table = 'game_table' |
ordering | 设置查询结果的默认排序规则。接受一个或多个字段名,前加- 表示降序。 | ordering = ('-pub_time', 'name') |
verbose_name | 单数形式的模型名称,在管理界面中使用。 | verbose_name = '游戏' |
verbose_name_plural | 复数形式的模型名称,在管理界面中使用。 | verbose_name_plural = '游戏们' |
unique_together | 一组字段必须一起唯一。 | unique_together = [['name', 'character']] |
indexes | 定义要在数据库中创建的索引。 | indexes = [models.Index(fields=['name'], name='name_idx')] |
permissions | 自定义权限。 | permissions = [('can_publish_game', 'Can Publish Game')] |
示例:
from django.db import models
class Game(models.Model):
# 游戏名称
name = models.CharField(max_length=100)
# 游戏中的角色
character = models.CharField(max_length=20)
# 发布时间,默认自动添加当前时间
pub_time = models.DateTimeField(auto_now_add=True)
# 游戏价格,默认为0
price = models.FloatField(default=0)
class Meta:
# 指定数据库表名为'game_table'
db_table = 'game_table'
# 默认按发布时间降序排列,如果发布时间相同,则按名字升序排列
ordering = ('-pub_time', 'name')
# 提供更友好的单数和复数名称
verbose_name = '游戏'
verbose_name_plural = '游戏们'
# 确保游戏名称和角色的组合是唯一的
unique_together = [['name', 'character']]
# 定义索引以加快查询速度
indexes = [
models.Index(fields=['name'], name='name_idx'),
models.Index(fields=['pub_time'], name='pub_time_idx')
]
# 添加自定义权限
permissions = [
('can_publish_game', 'Can Publish Game'),
]
def __str__(self):
return f"{self.name} - {self.character}"
db_table
: 明确指定了数据库表名为game_table
,而不是Django默认生成的表名。ordering
: 设置了默认的排序规则,首先按照pub_time
降序排列,如果发布时间相同,则按照name
升序排列。verbose_name
和verbose_name_plural
: 提供了更加友好的模型名称,这在Django管理后台中显示时会更有意义。unique_together
: 确保了每个游戏的名字和角色组合是唯一的,避免重复的数据记录。indexes
: 定义了两个索引,分别用于加速name
和pub_time
字段的查询效率。permissions
: 添加了一个自定义权限can_publish_game
,允许特定用户或组拥有发布游戏的权限。