Django笔记——操作数据库(ORM)第二节

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=0default='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_nameverbose_name_plural: 提供了更加友好的模型名称,这在Django管理后台中显示时会更有意义。
  • unique_together: 确保了每个游戏的名字和角色组合是唯一的,避免重复的数据记录。
  • indexes: 定义了两个索引,分别用于加速namepub_time字段的查询效率。
  • permissions: 添加了一个自定义权限can_publish_game,允许特定用户或组拥有发布游戏的权限。

你可能感兴趣的:(Django,数据库,django,笔记)