Django 模型

Django 模型

在Django框架中,模型(Model)是ORM(对象关系映射)的核心,它允许开发者以面向对象的方式操作数据库。模型类定义了数据库表的结构,每个实例代表表中的一行记录。在前面的基础上,我们将进一步扩写模型相关的内容,包括模型继承、自定义管理器、信号以及模型的生命周期等。

1. 模型继承

Django支持模型的继承,这有助于代码重用和逻辑组织。模型继承分为抽象基类模型和多态模型两种。

  • 抽象基类模型 :使用Meta类中的abstract = True声明。这种模型不会直接对应数据库中的表,而是作为其他模型的基类,提供共享字段和方法。
python 复制代码
from django.db import models

class AbstractPerson(models.Model):
    name = models.CharField(max_length=100)
    
    class Meta:
        abstract = True

class Student(AbstractPerson):
    # Student模型将继承AbstractPerson的所有字段,并可以添加自己的字段
    grade = models.CharField(max_length=2)
  • 多态模型 :通过第三方包如django-polymorphic实现,允许一个基类对应多个子类,并在查询时返回具体的子类实例。
2. 自定义管理器

管理器(Manager)是Django模型与数据库查询之间的接口。每个模型至少有一个管理器,默认是objects。通过自定义管理器,可以封装复杂的查询逻辑,使模型的使用更加直观。

python 复制代码
from django.db import models

class CustomManager(models.Manager):
    def get_active_students(self):
        # 假设有一个is_active字段表示学生是否活跃
        return self.filter(is_active=True)

class Student(models.Model):
    name = models.CharField(max_length=100)
    is_active = models.BooleanField(default=True)
    objects = CustomManager()
3. 信号(Signals)

Django信号允许在模型保存、删除等操作时自动执行特定函数。这对于实现如自动日志记录、用户通知等功能非常有用。

python 复制代码
from django.db.models.signals import post_save, pre_delete
from django.dispatch import receiver
from .models import Student

@receiver(post_save, sender=Student)
def student_post_save(sender, instance, created, **kwargs):
    if created:
        # 当新学生创建时执行的操作
        print(f"New student created: {instance.name}")

@receiver(pre_delete, sender=Student)
def student_pre_delete(sender, instance, **kwargs):
    # 在学生删除前执行的操作
    print(f"Student {instance.name} is about to be deleted")
4. 模型的生命周期

理解模型实例的生命周期对于调试和优化至关重要。模型实例从创建到保存(或删除)的过程中,会触发一系列方法,如__init__savecleanfull_clean等。

  • __init__:实例初始化时调用。
  • save :保存或更新实例时调用。可以通过重写save方法添加自定义逻辑。
  • clean :在调用full_clean时自动调用,用于验证字段值。
  • full_clean:在保存之前验证模型字段的完整性,包括唯一性、必填性等。
python 复制代码
class Student(models.Model):
    # ... 字段定义 ...

    def clean(self):
        # 自定义验证逻辑
        if self.age < 0:
            raise ValidationError({'age': "Age cannot be negative"})

    def save(self, *args, **kwargs):
        # 自定义保存逻辑
        self.full_clean()  # 强制验证
        super().save(*args, **kwargs)
5. 模型的进阶用法
  • 查询集(QuerySet):Django提供了强大的查询API,允许以链式调用的方式构建复杂的数据库查询。
  • 关联查询 :利用ForeignKeyManyToManyField等关系字段,可以方便地执行关联查询。
  • 聚合和注解:使用Django的聚合函数和注解功能,可以在数据库层面进行数据统计和计算。
python 复制代码
# 示例:统计每个班级的学生人数
from django.db.models import Count

grade_counts = Student.objects.values('grade').annotate(count=Count('id'))
for grade_count in grade_counts:
    print(f"Grade {grade_count['grade']} has {grade_count['count']} students")

通过深入理解和应用Django模型,开发者可以更加高效地管理数据库,构建出功能丰富、性能优异的Web应用。

相关推荐
Channing Lewis17 分钟前
sql server如何创建表导入excel的数据
数据库·oracle·excel
秃头摸鱼侠18 分钟前
MySQL安装与配置
数据库·mysql·adb
UGOTNOSHOT22 分钟前
每日八股文6.3
数据库·sql
行云流水行云流水1 小时前
数据库、数据仓库、数据中台、数据湖相关概念
数据库·数据仓库
John Song1 小时前
Redis 集群批量删除key报错 CROSSSLOT Keys in request don‘t hash to the same slot
数据库·redis·哈希算法
IvanCodes1 小时前
七、Sqoop Job:简化与自动化数据迁移任务及免密执行
大数据·数据库·hadoop·sqoop
tonexuan1 小时前
MySQL 8.0 绿色版安装和配置过程
数据库·mysql
JohnYan1 小时前
工作笔记- 记一次MySQL数据移植表空间错误排除
数据库·后端·mysql
我最厉害。,。2 小时前
Windows权限提升篇&数据库篇&MYSQL&MSSQL&ORACLE&自动化项目
数据库·mysql·sqlserver
远方16092 小时前
20-Oracle 23 ai free Database Sharding-特性验证
数据库·人工智能·oracle