用于预定义值的Django模型类方法

时间:2010-02-06 13:53:34

标签: python django django-models

我正在研究一些有这样模型的Django代码:

class Status(models.Model):
    code = models.IntegerField()
    text = models.CharField(maxlength=255)

大约有10个预定义的代码/文本对存储在数据库中。分散在代码库周围,我看到这样的代码:

status = Status.objects.get(code=0) # successful
status = Status.objects.get(code=1) # failed

我宁愿为每个方法设置一个方法,以便代码看起来像这样:

status = Status.successful()
status = Status.failed()
etc...

这可能吗?我已经查看了管理器的内容,但我还没找到方法。是时候真正的RTFM吗?

在Java中它将是一个静态方法,在Ruby中你只需要在self上定义一个方法,但在Python中它并不容易,是吗?

1 个答案:

答案 0 :(得分:35)

您或许应该通过为您的类定义自定义管理器并在该管理器上添加两个管理器方法来实现这一点(我认为这是为任何模型添加表级功能的首选方法)。但是,另一种方法是在您的类上放两个class methods查询并返回结果对象,例如:

class Status(models.Model):
    code = models.IntegerField()
    text = models.CharField(maxlength=255)

    @classmethod
    def successful(cls):
        return cls.objects.get(code=0)

    @classmethod
    def failed(cls):
        return cls.objects.get(code=1)

请注意,get()可能会引发不同的例外情况,例如Status.DoesNotExistMultipleObjectsReturned

对于如何使用Django管理器执行相同操作的示例实现,您可以执行以下操作:

class StatusManager(models.Manager):
    def successful(self):
        return self.get(code=1)

    def failed(self):
        return self.get(code=0)

class Status(models.Model):
    code = models.IntegerField()
    text = models.CharField(maxlength=255)

    objects = StatusManager()

在哪里,你可以Status.objects.successful()Status.objects.failed()来获得你想要的东西。