Django模型,自定义函数

zvms9eto  于 2023-05-01  发布在  Go
关注(0)|答案(3)|浏览(161)

我正在使用Django创建一个简单的应用程序。我意识到我经常做同样的手术。例如,我经常需要获取所有具有isPublick = True的Article对象。所以我想知道,是否可以在模型中定义一个get_published函数?
如果模型看起来像这样(简化)

class Article(models.Model):
    title = models.CharField(...)
    isPublished = models.BooleandField()

    def get_active(self):
       return Article.objects.filter(isPublicshed = 1)

但这似乎不起作用。
你能建议一种实现这一功能的方法吗?

wlzqhblo

wlzqhblo1#

你可能需要的是一个客户经理
Django文档:

# An example of a custom manager called "objects".

class PersonManager(models.Manager):
    def get_fun_people(self):
        return self.filter(fun=True)

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    fun = models.BooleanField()
    objects = PersonManager()

    def __unicode__(self):
        return u"%s %s" % (self.first_name, self.last_name)

然后你可以做一些事情,比如:

>>> p1 = Person(first_name='Bugs', last_name='Bunny', fun=True)
>>> p1.save()
>>> p2 = Person(first_name='Droopy', last_name='Dog', fun=False)
>>> p2.save()
>>> Person.objects.get_fun_people()
[<Person: Bugs Bunny>]
1sbrub3j

1sbrub3j2#

正如这里的文档所述,如果你需要向你的对象添加自定义 * 行级 * 功能,你需要在你的模型上定义自定义方法。然而,如果你追求的是自定义 table-wide 功能(比如获取符合某些条件的所有Article对象),你必须在model Managers上定义自定义方法(就像上面的 aciniglio 在他们的回答中指出的那样)。

2exbekwf

2exbekwf3#

你可以使用staticmethod装饰器。

class Article(models.Model):
    title = models.CharField(...)
    isPublished = models.BooleandField()

    @staticmethod
    def get_active():
        return Article.objects.filter(isPublished = 1)

相关问题