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

Django学习之操作数据库

操作数据库——模型常用Field及参数

一、常用字段类型Field

字段类型描述数据库映射类型
AutoField自动增长的整数主键int
BigAutoField64位自动增长的整数主键bigint
BooleanField存储布尔值(True/False)tinyint
CharField固定长度字符串,需指定max_lengthvarchar
DateField日期类型date
DateTimeField日期时间类型datetime
TimeField时间类型time
EmailField验证电子邮件格式的字符串,最大长度默认为254varchar(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地址,默认最大长度200varchar(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,允许特定用户或组拥有发布游戏的权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值