栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

0x08 -- Django -- 模型介绍 -- 8 -- 模型方法

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

0x08 -- Django -- 模型介绍 -- 8 -- 模型方法

目录
  • 0x00 -- 模型方法
  • 0x01 -- 最常用的模型方法
  • 0x02 -- 重写之前定义的模型方法


0x00 – 模型方法

在模型中添加自定义方法会给你的对象提供自定义的“行级”操作能力。
与之对应的是类 Manager 的方法意在提供“表级”的操作,模型方法应该在某个对象实例上生效。

这是一个将相关逻辑代码放在一个地方的技巧——模型。

比如,该模型有一些自定义方法:

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    birth_date = models.DateField()

    def baby_boomer_status(self):
        "Returns the person's baby-boomer status."
        import datetime
        if self.birth_date < datetime.date(1945, 8, 1):
            return "Pre-boomer"
        elif self.birth_date < datetime.date(1965, 1, 1):
            return "Baby boomer"
        else:
            return "Post-boomer"

    @property
    def full_name(self):
        "Returns the person's full name."
        return '%s %s' % (self.first_name, self.last_name)

例子中最后一个方法是 property。


0x01 – 最常用的模型方法
方法意义
__str__()一个 Python 的“魔法方法”,返回值友好地展示了一个对象。
Python 和 Django 在要将模型实例展示为纯文本时调用。最有可能的应用场景是交互式控制台或后台。
你将会经常定义此方法;默认提供的不是很好用。
get_absolute_url()该方法告诉 Django 如何计算一个对象的 URL。
Django 在后台接口使用此方法,或任意时间它需要计算一个对象的 URL。任何需要一个唯一 URL 的对象需要定义此方法。

0x02 – 重写之前定义的模型方法

还有一个 模型方法 的集合,包含了一些你可能自定义的数据库行为。
尤其是这两个你最有可能定制的方法 save() 和 delete()。

你可以随意地重写这些方法(或其它模型方法)来更改方法的行为。

一个典型的重写内置方法的场景是你想在保存对象时额外做些事。比如(查看文档 save() 了解其接受的参数):

from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def save(self, *args, **kwargs):
        do_something()
        super().save(*args, **kwargs)  # Call the "real" save() method.
        do_something_else()

也可以阻止保存

from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def save(self, *args, **kwargs):
        if self.name == "Yoko Ono's blog":
            return # Yoko shall never have her own blog!
        else:
            super().save(*args, **kwargs)  # Call the "real" save() method.

调用父类的方法非常重要——这里指 super().save(*args, **kwargs) ——确保对象正确的写入数据库。若你忘记调用父类方法,默认行为不会被触发,数据库也不会被操作。

同时传递模型方法接受的参数也很重要—— *args, **kwargs 会接受这些参数。Django 会不时地扩展模型内置方法的功能,也会添加新参数。如果你在重写的方法中使用了 *args, **kwargs,这将确保你的方法能接受这些新加的参数。


2021年9月22日

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/269862.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号