views:

363

answers:

3

Hi!

I am creating simple application with django. Also, I realized that I am doing some kind of operations very often. For example I often need to get all Article objects which have isPublick = True. So I am thinking is that possible to define get_published function in model?

if models looks like this (simplified)

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

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

But it doesn't work this way

Can you suggest a way of implementing the function?

+6  A: 

What you probably want is a custom manager

From the 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)

which then allows you to do something like:

>>> 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>]
aciniglio
+2  A: 

As is stated in the docs here, if you need to add custom row-level functionality to your objects, you need to define custom methods on your models. However, if what you are after is custom table-wide functionality (such as getting all Article objects that qualify certain conditions), you have to define custom methods on model Managers (much as aciniglio above points out in their answer).

ayaz
+1  A: 

You can use the staticmethod decorator.

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

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