• Django模型的属性与方法


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

    3.5.1  模型属性

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

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

    3.5.2  模型方法

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

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

    【代码3-12】

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

    【代码分析】

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

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

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

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

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

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

    【代码3-13】

    1. 01 from django.db import models
    2. 02
    3. 03 class Blog(models.Model):
    4. 04 name = models.CharField(max_length=100)
    5. 05 tagline = models.TextField()
    6. 06
    7. 07 def save(self, *args, **kwargs):
    8. 08 do_something()
    9. 09 super().save(*args, **kwargs) # Call the "real" save() method.
    10. 10 do_something_else()
    11. 11 #...
    12. 12 pass

    【代码分析】

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

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

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

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

    【代码3-14】

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

    【代码分析】

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

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

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

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

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

  • 相关阅读:
    C++重载运算符
    Git (3)—
    java 旋转方阵
    [数据集][VOC]高质量的目标检测数据集合集(持续更新)
    献给Nacos小白的一篇好文:服务的健康检查
    数字孪生技术钢铁行业可视化管理平台
    【PHP快速上手(十四)】
    Django Channel layers -- 实时应用程序的消息中间件
    k8s集群中部署服务之Dockerfile文件准备
    Go语言协程
  • 原文地址:https://blog.csdn.net/brucexia/article/details/138063450