Django模型的属性与方法

本节介绍Django模型的属性和方法,以及如何重写之前定义的模型方法等内容。

3.5.1 模型属性

Django模型中最重要的属性就是Manager,它是Django模型和数据库查询操作之间的接口,并且被用作从数据库当中获取实例的途径。如果Django模型中没有指定自定义的Manager,则默认名称就是"objects"。

另外,Manager只能通过模型类来访问,不能通过模型实例来访问。

3.5.2 模型方法

在Django模型中添加自定义方法,会给对象提供自定义的"行级"操作能力;与之对应的是Manager的方法,其目的在于提供"表级"的操作。模型方法应该在某个对象实例上生效,这是一个将相关逻辑代码放在模型上的技巧。

关于模型方法的使用,示例代码如下:

【代码3-12】

复制代码
01  from django.db import models
02  
03  class PersonAge(models.Model):
04      name = models.CharField(max_length=32)
05      age = models.CharField(max_length=8)
06  
07      def person_age_status(self):
08          "Returns the person's age status."
09          if self.age < 1:
10              return "Baby"
11          elif self.age < 3:
12              return "Toddler"
13          elif self.age < 6:
14              return "Preschooler"
15          elif self.age < 12:
16              return "School-Children"
17          elif self.age < 18:
18              return "Teenager"
19          elif self.age < 40:
20              return "Youth"
21          elif self.age < 60:
22              return "Middle-Age"
23          else:
24              return "Old-Age"
25  
26      @property
27      def person_info(self):
28          "Returns the person's info."
29          return '%s %s' % (self.name, self.age)
30      #...
31      pass

【代码分析】

在第03行代码中,定义了一个描述人的年龄段的类PersonAge。

在第07~24行代码中,定义了PersonAge类的模型方法person_age_status(),返回具体年龄段的信息。

在第26~29行代码中,定义了PersonAge类的属性方法person_info(),返回个人信息。

3.5.3 重写之前定义的模型方法

Django模型中还有一个关于模型方法的集合,其中包含了一些可能是自定义的数据库行为,比如save()方法和delete()方法就是两个最有可能定制的方法。同时,设计人员可以重写这些方法(或其他模型方法)以更改方法的行为。

有一个非常典型的重写内置方法的场景,就是打算在保存对象时额外做一些事。关于重写save()方法的示例代码如下:

【代码3-13】

复制代码
01  from django.db import models
02  
03  class Blog(models.Model):
04      name = models.CharField(max_length=100)
05      tagline = models.TextField()
06  
07      def save(self, *args, **kwargs):
08          do_something()
09          super().save(*args, **kwargs)  # Call the "real" save() method.
10          do_something_else()
11      #...
12      pass

【代码分析】

在第03行代码中,定义了一个描述博客的类Blog。

在第07~10行代码中,重写了save()方法,具体说明如下:

  • 第09行代码中,通过super()方法调用了父类中原生的save()方法。
  • 在第08行和第10行代码中,设计人员可以通过编写自己的代码来实现重写save()方法。

另外,还可以重写 save()方法来阻止该方法的执行,示例代码如下:

【代码3-14】

复制代码
01  from django.db import models
02  
03  class Blog(models.Model):
04      name = models.CharField(max_length=100)
05      tagline = models.TextField()
06      
07      def save(self, *args, **kwargs):
08          if self.name == "King's blog":
09              return # King永远不应该有自己的博客
10          else:
11              super().save(*args, **kwargs)  # 调用原生的save()方法
12      #...
13      pass

【代码分析】

在第03行代码中,定义了一个描述博客的类Blog。

在第07~11行代码中,重写了save()方法,具体说明如下:

  • 在第08~11行代码中,通过"if...else..."条件语句判断name属性值,然后根据判断条件来选择是否通过super()方法来调用父类中原生的save()方法。

Django模型会不时地扩展模型内置方法的功能,也会添加新参数。假如设计人员在重写的方法中使用了*args和**kwargs参数,则必须确保重写方法能够接收这些新添加的参数。

本文节选自《Django 5企业级Web应用开发实战(视频教学版)》,获出版社和作者授权发布。

相关推荐
风哥2号4 小时前
数据库教程FGMT27‑MySQL数据库基础知识与体系架构
数据库·mysql
YangYang9YangYan5 小时前
2026 校招商品分析岗位 JD 拆解,核心指标、工具与面试考点
大数据·数据库·数据分析
weixin_BYSJ19875 小时前
【计算机毕设】基于SpringBoot与Vue的文物保护档案管理系统08621
vue.js·spring boot·spring cloud·微服务·架构·django·课程设计
西安栈上月明软件科技6 小时前
从业务黑话到本体图谱:OAG本体建模五步法(西安老系统AI化改造实战)
数据库·人工智能·架构
anxiao_m6 小时前
跨云跨机房大数据迁移怎么选?不同场景工具适配指南
数据库·云启快传
风哥2号8 小时前
数据库教程FGMT43‑MySQL性能分析与优化调整
数据库·mysql
随身数智备忘录8 小时前
财务数据分析如何与业务场景结合?财务数据分析如何从数出有据到数出有用?
数据库
这个DBA有点耶9 小时前
数据库教程:从零基础到实战的完整学习路径(2026版)
数据库·程序员·代码规范
forestsea10 小时前
从零构建 Java 智能体 RAG 系统:Milvus 向量数据库实战指南
java·数据库·milvus
probex_10 小时前
从 ByConity 到 VictoriaMetrics:一次指标数据迁移引发的四种存储对比
数据库