Django Model模型层详解

课程目标

  • 理解Django ORM的概念和作用
  • 掌握Model的定义和字段类型
  • 学会数据库迁移操作
  • 了解QuerySet的基本使用

Django ORM简介

Django ORM(Object-Relational Mapping)是Django框架的核心特性之一,它允许我们使用Python代码来操作数据库,而无需编写SQL语句。ORM将数据库表映射为Python类,将表中的记录映射为类的实例。

ORM的优势:

  • 跨数据库兼容:一套代码可在不同数据库间切换
  • 安全性:自动防止SQL注入攻击
  • 易用性:使用Python语法操作数据库
  • 可维护性:代码更易理解和修改

Model的定义

基本Model结构

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField('date published')
    author = models.CharField(max_length=100)
    
    def __str__(self):
        return self.title
    
    class Meta:
        ordering = ['-pub_date']
        verbose_name = '文章'
        verbose_name_plural = '文章'

常用字段类型

  • CharField:字符串字段,需要指定max_length
  • TextField:长文本字段
  • IntegerField:整数字段
  • DateTimeField:日期时间字段
  • BooleanField:布尔字段
  • ForeignKey:外键关系
  • ManyToManyField:多对多关系
  • EmailField:邮箱字段
  • URLField:URL字段

数据库迁移

创建迁移文件

python manage.py makemigrations

执行迁移

python manage.py migrate

查看迁移状态

python manage.py showmigrations

QuerySet基础操作

创建记录

# 方法1:save()
article = Article(title='Django教程', content='...')
article.save()

# 方法2:create()
Article.objects.create(title='Django教程', content='...')

查询记录

# 获取所有记录
articles = Article.objects.all()

# 获取单个记录
article = Article.objects.get(id=1)

# 获取第一个记录
first_article = Article.objects.first()

# 过滤查询
recent_articles = Article.objects.filter(pub_date__year=2023)

更新记录

# 更新单个记录
article = Article.objects.get(id=1)
article.title = '新标题'
article.save()

# 批量更新
Article.objects.filter(author='admin').update(content='...')

删除记录

# 删除单个记录
article = Article.objects.get(id=1)
article.delete()

# 批量删除
Article.objects.filter(pub_date__lt='2022-01-01').delete()

高级查询技巧

条件查询

# 包含查询
Article.objects.filter(title__contains='Django')

# 不区分大小写
Article.objects.filter(title__icontains='django')

# 正则表达式
Article.objects.filter(title__regex=r'^Django.*')

# 范围查询
Article.objects.filter(pub_date__range=['2023-01-01', '2023-12-31'])

关联查询

# 外键查询
articles = Article.objects.filter(author__username='admin')

# 反向查询
author.articles.all()  # 假设Author和Article有关联

Model字段选项

通用字段选项

  • null:是否允许数据库中为NULL
  • blank:在表单验证时是否允许为空
  • default:默认值
  • choices:选择项
  • help_text:帮助文本
  • unique:是否唯一

示例

class Article(models.Model):
    STATUS_CHOICES = [
        ('draft', '草稿'),
        ('published', '已发布'),
    ]
    
    title = models.CharField(
        max_length=200,
        null=False,
        blank=False,
        help_text='文章标题'
    )
    status = models.CharField(
        max_length=20,
        choices=STATUS_CHOICES,
        default='draft'
    )
    views = models.IntegerField(default=0)

Meta选项

常用Meta选项

class Article(models.Model):
    # ... 字段定义 ...
    
    class Meta:
        db_table = 'my_article'  # 自定义表名
        ordering = ['-pub_date']  # 默认排序
        verbose_name = '文章'  # 人类可读的单数名
        verbose_name_plural = '文章'  # 人类可读的复数名
        unique_together = ['title', 'author']  # 联合唯一约束

索引优化

添加数据库索引

class Article(models.Model):
    title = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(unique=True)
    
    class Meta:
        indexes = [
            models.Index(fields=['title', 'pub_date']),
            models.Index(fields=['author'], name='author_idx'),
        ]

课程总结

本节课我们深入学习了Django的Model层,包括ORM的概念、Model的定义、数据库迁移以及QuerySet的基本操作。这些是Django开发的基础,熟练掌握它们对后续学习至关重要。