2009-09-03 35 views
17

estoy creando sencilla aplicación con Django. Además, me di cuenta de que estoy haciendo algún tipo de operaciones muy a menudo. Por ejemplo, a menudo necesito obtener todos los objetos de Artículo que tengan isPublick = True. ¿Entonces estoy pensando que es posible definir la función get_published en el modelo?Django modelos, funciones personalizadas

si los modelos se parece a esto (simplificado)

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

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

Pero no funciona de esta manera

¿Puede sugerir una forma de implementar la función?

Respuesta

53

Lo que probablemente quieres es un custom manager

De la documentación de 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) 

que a su vez le permite hacer algo como:

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

buen ejemplo de código. Explicó sucintamente una parte de django que antes me parecía inútil (en mi noobosidad). +1. – chucksmash

12

Como se dice en el docs here, Si es necesario agregar a medida nivel de fila funcionalidad a sus objetos, es necesario definir los métodos personalizados en su modo de ls. Sin embargo, si lo que busca es una funcionalidad en toda la tabla (como obtener todos los objetos Artículo que califican ciertas condiciones), tiene que definir métodos personalizados en model Managers (como aciniglio indica en su respuesta).

11

Usted puede utilizar el decorador métodoestático.

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

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

¡Gracias por mencionar esto! Respondió mi, diferente, pregunta. – alexsalo

+1

Esto debería ser un 'classmethod' en su lugar. –

Cuestiones relacionadas