2010-03-24 34 views
1

我在数据库中列出了一些项目,通过Reddit的算法订购。这可以通过ORM来完成吗? - Django

这是它:

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) 

我不知道是否有使用Django的ORM,以更新模型散装的任何聪明的办法。

没有这样做:

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

我知道的F()对象,但我不能计算出,如果这个功能可以在ORM内部进行。


任何想法?

帮助将非常感谢!

回答

2

它没有太多的工作做手工:

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不是很熟悉的光标。非常感谢,我现在就试试看。 – RadiantHex 2010-03-24 18:08:22

+1

这比通过ORM做更有效吗? OP真的想通过一个更新查询来完成整个事情,但是您的方式仍然会为每个项目调用一次'reddit_rank'。 – 2010-03-24 20:03:59