Django定义模型类方法

Posted by FanHao on 2020-07-10

说明

以下在python3.6 Django2.2.10测试通过

实例

orm模型全称对象关系映射模型,能够将数据库中的表映射成类,记录(行数据)映射成对象,字段映射成对象的属性。

定义数据类模型能够帮助我们在更上层设计业务逻辑,将复杂的业务逻辑与数据逻辑分离。

对重复的业务逻辑代码或者数据查询代码,可封装成类方法,实现复用。

以下定义了用户信息的模型代码。UserInfo类实例化后为用户对象,用户对象具备了用户名、工号等属性信息,同时具备get_joined_ponits()等方法。

类方法也可以传递参数,以下代码类方法没有参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from training.models import Course

class UserInfo(models.Model):
"""
用户详细信息表
"""
id = models.AutoField(primary_key=True)
user = models.OneToOneField(User, on_delete=models.CASCADE, unique=True)
job_num = models.CharField(verbose_name="工号", max_length=8, blank=True)
realname = models.CharField(verbose_name="真实姓名", max_length=10)
email = models.EmailField(verbose_name="邮箱", max_length=32)
phone = models.CharField(verbose_name="手机号", max_length=11)
group = models.ForeignKey(Group, related_name='user_group', verbose_name="用户所属组", on_delete=models.DO_NOTHING)
rank = models.ForeignKey(Rank, related_name="user_rank", verbose_name="用户职级", on_delete=models.DO_NOTHING)
role = models.ForeignKey(Role, related_name='user_role', verbose_name="用户角色", on_delete=models.DO_NOTHING)
education = models.CharField(verbose_name="学历", max_length=20)
pre_job = models.CharField(verbose_name="上一份工作", max_length=20)
entry_time = models.DateField(verbose_name="入职时间")

class Meta:
verbose_name = "用户信息"
verbose_name_plural = "用户信息"

def __str__(self):
return self.user.username

def get_joined_points(self):
# 类方法,返回该User参加的培训的积分
course = Course.objects.filter(student=self.user.userinfo).exclude(teacher_id=self.id)
point = course.count() * 1
return point

def get_group_points(self):
# 类方法,返回该User主持小组的培训的积分
course = Course.objects.filter(teacher_id=self.id).exclude(range="测试部")
return course.count() * 2

def get_department_points(self):
# 类方法,返回该user主持部门的培训的积分
course = Course.objects.filter(teacher_id=self.id, range="测试部")
return course.count() * 2

类方法在实例化后,可通过如下方式进行调用

1
2
3
xiaoming = UserInfo.objects.get(id=1)
# 返回xiaoming参加培训的积分
xiaoming.get_joined_points()