2010-03-28 112 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]