2010-03-24 6 views
1

J'ai quelques éléments répertoriés dans une base de données, classés par l'algorithme de Reddit.Cela peut-il être fait avec l'ORM? - Django

voici:

def reddit_ranking(post): 
    t = time.mktime(post.created_on.timetuple()) - 1134000000 
    x = post.score 

    if x>0: y=1 
    elif x==0: y=-0 
    else: y=-1 

    if x<0: z=1 
    else: z=x 

    return (log(z) + y * t/45000) 

Je me demande s'il y a une façon intelligente d'utiliser ORM de Django , afin de mettre à jour les modèles en vrac.

Sans cela:

items = Item.objects.filter(created_on__gte=datetime.now()-timedelta(days=7)) 
for item in items: 
    item.reddit_rank = reddit_rank(item) 
    item.save() 

Je sais que sur l'objet F(), mais je ne peux pas savoir si cette fonction peut être réalisée à l'intérieur du ORM.


Des idées?

Une aide serait grandement appréciée!

Répondre

2

Il n'y a pas beaucoup de travail à faire manuellement:

from django.db import connection 

items = Item.objects.filter(created_on__gte=datetime.now()-timedelta(days=7)) 
cursor = connection.cursor() 
cursor.executemany("UPDATE myapp_item SET reddit_rank = %s WHERE id = %s", 
        [(reddit_rank(item), item.pk) for item in items]) 
cursor.close() 
+0

@insin pas très familier avec le curseur. Merci beaucoup, je vais essayer maintenant. – RadiantHex

+1

Comment cela est-il plus efficace que de le faire via l'ORM? L'OP voulait vraiment tout faire par le biais d'une seule requête de mise à jour, mais vous appelez encore 'reddit_rank' une fois pour chaque élément. –

Questions connexes