Django模型类方法用于预定义值
我正在写一些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...
这样做可能吗?我查过管理器的相关内容,但还没找到合适的方法。是不是该认真看看手册了?
在Java中,这会是一个静态方法,而在Ruby中,你只需在self上定义一个方法,但在Python中,这可没那么简单,对吧?
1 个回答
51
你可以通过为你的类定义一个自定义管理器来实现这个功能,并在这个管理器上添加两个管理方法(我认为这是为任何模型添加表级功能的推荐方式)。不过,另一种做法是直接在你的类里添加两个类方法,这些方法可以查询并返回结果对象,比如:
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.DoesNotExist
和 MultipleObjectsReturned
。
如果你想看看如何使用 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()
来获取你想要的结果。