2009-09-03 73 views
17

我正在用django创建简单的应用程序。另外,我意识到我正在经常进行某种操作。例如,我经常需要获取所有具有isPublick = True的Article对象。所以我认为可以在模型中定义get_published函数?Django模型,自定义函数

如果模型看起来像这样(简体)

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

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

但它不以这种方式工作

您能否提供实现功能的方式是什么?

回答

53

你可能想要的是一个custom manager

从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) 

,然后允许你做这样的事情:正如docs here陈述

>>> 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>] 
+3

很好的代码示例。简洁地解释了以前对我来说毫无意义的django的一部分(在我的noobosity中)。 +1。 – chucksmash 2012-10-12 13:43:55

12

,如果您需要为您的对象添加自定义的行级功能,则需要在您的模式中定义自定义方法LS。但是,如果您在后面定制表的范围功能(例如获取所有符合某些条件的Article对象),则必须在model Managers上定义自定义方法(如上面指出的aciniglio)。

11

您可以使用staticmethod装饰器。

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

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

感谢您提出这个!回答了我的不同的问题。 – alexsalo 2016-01-14 16:43:54

+1

这应该是一个'classmethod'来代替。 – 2017-02-22 13:04:07