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

29 投票
1 回答
26843 浏览
提问于 2025-04-15 18:58

我正在写一些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.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() 来获取你想要的结果。

撰写回答