2010-03-28 81 views
0

我想要的很简单:如何将此查询转换为“django模型查询”?

型号:


class userLastTrophy(models.Model): 
    user  = models.ForeignKey(userInfo) 
    platinum = models.IntegerField() 
    gold = models.IntegerField() 
    silver = models.IntegerField() 
    bronze = models.IntegerField() 
    level = models.IntegerField() 
    rank = models.IntegerField() 
    perc_level = models.IntegerField() 
    date_update = models.DateTimeField(default=datetime.now, blank=True) 
    total = models.IntegerField() 
    points = models.IntegerField() 

class userTrophy(models.Model): 
    user  = models.ForeignKey(userInfo) 
    platinum = models.IntegerField() 
    gold = models.IntegerField() 
    silver = models.IntegerField() 
    bronze = models.IntegerField() 
    total = models.IntegerField() 
    level = models.IntegerField() 
    perc_level = models.IntegerField() 
    date_update = models.DateTimeField(default=datetime.now, blank=True) 
    rank = models.IntegerField(default=0) 
    total = models.IntegerField(default=0) 
    points = models.IntegerField(default=0) 
    last_trophy = models.ForeignKey(userLastTrophy, default=0) 

我有这个疑问:


select t2.user_id as id, 
     t2.platinum - t1.platinum as plat, 
     t2.gold  - t1.gold as gold, 
     t2.silver - t1.silver as silver, 
     t2.bronze - t1.bronze as bronze, 
     t2.points - t1.points as points from myps3t_usertrophy t2, myps3t_userlasttrophy t1 where 
     t1.id = t2.last_trophy_id order by points; 

如何与Django模型做到这一点?

+0

我觉得这是不好的设计。你应该把所有这些放在一个模型中(它基本上是一样的),让'last_trophy'指向它自己。 – 2010-03-28 18:46:01

+0

如果我需要每个用户超过一个“userLastTrophy”,并且只有一个userTrophy,那么该怎么办?有一个更好的方法吗 ? 这只是一个例子,你知道如何在django模型中做到这一点吗? – fabriciols 2010-03-28 22:47:40

回答

0

成全它与日期字段一个模型已经建立:

from django.contrib.auth.models import User 

class Trophy(models.Model): 
    user  = models.ForeignKey(User, related_name='trophies') 
    creation_date = model.DateField(auto_now_add=True) 

你会发现:

  • 我们设置的外键的用户模型,不用户信息。通过这种方式,您可以轻松获取当前用户以及视图中的特洛伊。使用户信息a user profile
  • 奖杯应该有其第一个字母大写。用户前缀是相当无用的,除非你获得比用户更多的奖品。
  • 创建日期,与auto_now_add设置为true,将自动设置为当新的对象将被创建
  • 相关的名称让你给一个自然的名字到反向完全自然的,而不是让“trophy_set”
  • 当前日期

然后,您可以把所有的奖杯最后是这样的:

# we get the last 3 trophies, '-' sort from last to first 
print user.trophies.order_by('-creation_date')[:3] 
相关问题