Подтвердить что ты не робот

Модели Django, пользовательские функции

Я создаю простое приложение с django. Кроме того, я понял, что делаю некоторые операции очень часто. Например, мне часто нужно получить все объекты статьи, которые имеют isPublick = True. Поэтому я думаю, что можно определить функцию get_published в модели?

если модели выглядят так (упрощенно)

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

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

Но это не работает.

Можете ли вы предложить способ реализации функции?

4b9b3361

Ответ 1

Возможно, вам нужен пользовательский менеджер

Из django docs:

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

Ответ 2

Как указано в docs здесь, если вам нужно добавить пользовательские функции уровня строки для своих объектов, вам необходимо определить собственные методы на ваших моделях. Тем не менее, если вы после этого используете пользовательские функции на основе таблиц (такие как получение всех объектов статьи, которые соответствуют определенным условиям), вы должны определить пользовательские методы в model Managers (так же, как ацинильо выше указывает на их ответ).

Ответ 3

Вы можете использовать статический метод декоратора.

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

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