2009-09-03 7 views
17

Я создаю простое приложение с django. Кроме того, я понял, что делаю некоторые операции очень часто. Например, мне часто нужно получить все объекты статьи, которые имеют isPublick = True. Поэтому я думаю, что можно определить функцию 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

Из Джанго документы:

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

Хороший пример кода. Вкратце объяснила часть джанго, которая ранее казалась мне бессмысленной (в моей нозопольности). +1. – chucksmash

12

Как говорится в docs here, если вам нужно добавить пользовательские функции на уровне строк, вам необходимо определить пользовательские методы в вашем режиме левая сторона Тем не менее, если то, что вам нужно, является обычным таблицей (например, получение всех объектов Статьи, которые соответствуют определенным условиям), вы должны определить пользовательские методы на 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

+1

Вместо этого это будет «classmethod'. –

Смежные вопросы