2011-02-08 3 views
0

Je le modèle suivant:Ajouter un champ supplémentaire dans Django QuerySet comme timedelta Type

class UptimeManager(models.Manager): 
    def with_length(self): 
     """Get querySet of uptimes sorted by length including the current one. """ 
     extra_length = Uptime.objects.extra(select={'length': 
      """ 
      SELECT 
       IF (end is null, 
       timestampdiff(second,begin,now()), 
       timestampdiff(second,begin,end)) 
      FROM content_uptime c 
      WHERE content_uptime.id = c.id 
      """ 
      }) 
     return extra_length 


class Uptime(models.Model): 
    begin = models.DateTimeField('beginning') 
    end = models.DateTimeField('end', null=True) I call 
    host = models.ForeignKey("Host") 
    objects = UptimeManager() 
    ... 

j'appelle Uptime.objects.with_length().order_by('-length')[:10] pour obtenir la liste des plus longues durées de fonctionnement. Mais le length dans le modèle est de type entier. Comment modifier mon code comme la longueur de l'objet retourné par le gestionnaire serait accessible dans le modèle comme objet timedelta? Je pourrais presque le faire en retournant une liste et en convertissant le nombre de secondes en timedelta objets, mais ensuite je dois faire le tri, le filtrage etc. dans mon code Python qui est plutôt inefficace par rapport à une requête SQL bien faite.

Répondre

0

Ma solution est de créer un filtre qui détermine le type de var longueur et retourne timedelta dans le cas où il est un type entier

from django import template 
import datetime 

register = template.Library() 

def timedelta(value): 
    if isinstance(value, (long,int)): 
     return datetime.timedelta(seconds=value) 
    elif isinstance(value, datetime.timedelta): 
     return value 
    else: raise UnsupportedOperation 

register.filter('timedelta',timedelta) 

et utiliser dans le modèle, il est trivial {{ uptime.length|timedelta }}

1

Add a property au modèle qui regarde le champ réel et le convertit au type approprié.

+0

Mais où exactement dois-je utiliser une propriété? Parce que je suis plutôt un novice à Django, donc je peux le voir;) – damienix

Questions connexes