说明
以下在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): course = Course.objects.filter(student=self.user.userinfo).exclude(teacher_id=self.id) point = course.count() * 1 return point
def get_group_points(self): course = Course.objects.filter(teacher_id=self.id).exclude(range="测试部") return course.count() * 2
def get_department_points(self): course = Course.objects.filter(teacher_id=self.id, range="测试部") return course.count() * 2
|
类方法在实例化后,可通过如下方式进行调用
1 2 3
| xiaoming = UserInfo.objects.get(id=1)
xiaoming.get_joined_points()
|