django模型5

元选项

使用一个内部类class Meta可以给模型提供元数据,就像这样:

class Ox(models.Model):

    horn_length = models.IntegerField()

 

    class Meta:

        ordering = ["horn_length"]

        verbose_name_plural = "oxen"

模型元数据是“无法用字段描述的事物”,比如排序选项(ordering),数据库表名(db_table),或人性化的单数和复数名字(verbose_name和verbose_name_plural)。它们都不是必须的,也就是说添加一个class Meta内部类到一个模型完全是可选的。

所有可用的元选项完整列表可以在模型选项参考中查看。

 

模型方法

通过在模型类中定义方法可以为对象添加“行级”的功能性方法。与Manager这样的“表级”方法不同的是,模型方法作用于特定的模型实例。

对于想把所有的业务逻辑放在模型这一个地方,这是一项极有价值的技术。

例如,下面的模型包含一些自定义方法:

from django.contrib.localflavor.us.models import USStateField

 

class Person(models.Model):

    first_name = models.CharField(max_length=50)

    last_name = models.CharField(max_length=50)

    birth_date = models.DateField()

    address = models.CharField(max_length=100)

    city = models.CharField(max_length=50)

    state = USStateField() # Yes, this is America-centric...

 

    def baby_boomer_status(self):

        "Returns the person's baby-boomer status."

        import datetime

        if datetime.date(1945, 8, 1) <= self.birth_date <= datetime.date(1964, 12, 31):

            return "Baby boomer"

        if self.birth_date < datetime.date(1945, 8, 1):

            return "Pre-boomer"

        return "Post-boomer"

 

    def is_midwestern(self):

        "Returns True if this person is from the Midwest."

        return self.state in ('IL', 'WI', 'MI', 'IN', 'OH', 'IA', 'MO')

 

    def _get_full_name(self):

        "Returns the person's full name."

        return '%s %s' % (self.first_name, self.last_name)

full_name = property(_get_full_name)

 

这个例子中的最后一个方法是一个属性方法。(译者注:即读取full_name属性将自动调用_get_full_name方法)。

在模型实例参考中有关于模型自动存在的方法的完整列表。你可以重写它们中的大多数,查看下面的重写预定义的模型方法。下面这两个方法是我们经常需要定义的:

__unicode__()

一个python“魔幻方法”,用于返回任何对象的unicode编码的对象的“字符表达形式”。它是在Python和Django中强制地返回和显示一个模型实例的文本字符串表达方式的方法。需要注意的是,这仅仅当你需要在交互控制台或admin应用中显示对象时起作用。

一般情况下,你都需要定义这个方法;Django默认的方式一点都不友好。

Get_absolute_url()

它告诉Django如果计算出一个对象的URL。Django会在admin应用界面中使用它,以及任何需要用到对象的URL的地方。

任何需要用一个URL唯一标识它的对象都需要定义这个方法。

 

重写预定义的模型方法

 

另外一些将部分数据库命令打包的模型方法你可能也需要定制。实践中你可能常常需要改变save()和 delete()的工作方式。

你可以自由地重写这些方法(以及其它一些模型方法)以改变它们的行为。

一个典型的重写内建方法的用例是当你保存一个对象时期望某些其它事情发生。例如(查看save()文档中描述的它可以接受的参数):

class Blog(models.Model):

    name = models.CharField(max_length=100)

    tagline = models.TextField()

 

    def save(self, *args, **kwargs):

        do_something()

        super(Blog, self).save(*args, **kwargs) # Call the "real" save() method.

        do_something_else()

你也可以阻止保存:

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(Blog, self).save(*args, **kwargs) # Call the "real" save() method.

 

重要的是,一定要记得调用父类的方法,也就是super(Blog, self).save(*args, **kwargs),以确保对象仍然会被保存到数据库中。如果你忘记调用父类的方法,默认行为将不会被执行,数据库将不会被触及到。

传递的参数也是同样重要的,这些参数将被传递给模型方法,我们通过*args, **kwargs做到这一点。Django有时通过添加新的参数来扩展内建方法的能力。如果在定义方法时使用了*args, **kwargs,当它们在调用时被使用到,你的代码将确保它们会得到支持。

 

执行定制SQL

另一种常见的模式是在模型方法或模块极方法中建立定制SQL语句。关于使用原始SQL的详细内容,请查看使用原始SQL文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值