codecamp

Django4.0 模型-方法

在模型中添加自定义方法会给你的对象提供自定义的“行级”操作能力。与之对应的是类 ​​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)
  • ​​__str__()​​:返回值展示了一个对象。Python 和 Django 在要将模型实例展示为纯文本时调用。最有可能的应用场景是交互式控制台或后台。你将会经常定义此方法;默认提供的不是很好用。
  • ​​get_absolute_url()​​:该方法告诉 Django 如何计算一个对象的 URL。Django 在后台接口使用此方法,或任意时间它需要计算一个对象的 URL。任何需要一个唯一 URL 的对象需要定义此方法。

重写之前定义的模型方法

还有一个 模型方法 的集合,包含了一些你可能自定义的数据库行为。尤其是这两个你最有可能定制的方法 ​​save()​​ 和 ​​delete()​​。你可以随意地重写这些方法(或其它模型方法)来更改方法的行为。一个典型的重写内置方法的场景是你想在保存对象时额外做些事。

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​​,这将确保你的方法能接受这些新加的参数。

注意:

重写的模型方法不会在批量操作中调用。

删除一个模型对象不总是要调用 ​​delete()​​ 方法。例如,使用 ​QuerySet ​批量删除对象 ​<topics-db-queries-delete>​ 和 级联删除。为了确保自定义的删除逻辑被执行,你可以使用 ​​pre_delete​​和 ​​post_delete​​信号。不幸的是,批量 ​​creating​​和 ​​updating​​操作不支持上述操作,因为这两种操作未调用 ​​save()​​,​​pre_save​​ 和 ​​post_save​​。

执行自定义SQL

另一个常见的模式是在模型方法和模块方法中编写自定义 SQL 语句。


Django4.0 模型-属性
Django4.0 模型-继承
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Django4.0 模型和数据库

Django4.0 处理HTTP请求

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }