2014-01-15 51 views
5

我想要查詢的工作原理如下SQL:Django模型查詢使用加入

sql_str = ''' 
    select * from luckydraw_winner W 
    inner join luckydraw_prizeverificationcodesmslog L on W.id =L.winner_id 
    where W.lucky_draw_id = %s 
    limit 10 
''' 

型號:

class Winner(models.Model): 
    lucky_draw = models.ForeignKey(LuckyDraw) 
    participation = models.ForeignKey(Participation) 
    prize = models.ForeignKey(Prize) 
    mobile_number = models.CharField(max_length=15, null=True, default = None) 

class PrizeVerificationCodeSMSLog(models.Model): 
    winner = models.ForeignKey(Winner) 
    mobile_number = models.CharField(max_length=15, db_index=True) 
    created_on = models.DateTimeField(auto_now_add=True) 

因爲mobile_number並不總是充滿Winner模型,我要的是一個擁有手機號碼或獲得短信的贏家。所以必須加入PrizeVerificationCodeSMSLog才能達到我的目的。
只有拿到冠軍很簡單:

winners = models.Winner.objects.filter(lucky_draw_id=id).order_by('-created_on')[:10] 

但我不知道可以加什麼過濾器加入PrizeVerificationCodeSMSLog


我終於明白如何在django中檢索我想要的數據。

如果您想獲得型號A受其他型號B限制,該型號的外鍵爲A,請不要嘗試使用filter()。因爲A不知道B,但B知道A!只要檢索A基地B

+0

你可以在添加外鍵時將名稱添加到關係中母雞A將通過該命名關係知道B.在文檔中查看'ForeignKey.related_name'和'ForeignKey.related_query_name'。 – Raiyan

回答

4

嘗試

logs = PrizeVerificationCodeSMSLog.objects.filter(winner__lucky_draw_id=id).order_by('-created_on') 
winners = logs.select_related("winner")[:10] 

這會產生以下查詢

SELECT "prizeverificationcodesmslog"."id", "prizeverificationcodesmslog"."winner_id", 
    "prizeverificationcodesmslog"."mobile_number", "prizeverificationcodesmslog"."created_on", 
    "winner"."id", "winner"."lucky_draw_id", "winner"."participation_id", 
    "winner"."prize_id", "winner"."mobile_number" 
FROM "prizeverificationcodesmslog" 
INNER JOIN "winner" ON ("prizeverificationcodesmslog"."winner_id" = "winner"."id") 
WHERE "winner"."lucky_draw_id" = 1 
ORDER BY "prizeverificationcodesmslog"."created_on" 
DESC LIMIT 10; 

我不知道你有什麼要求,但您可能希望通過最大PrizeVerificationCodeSMSLog到agregate

看到https://docs.djangoproject.com/en/1.5/topics/db/aggregation/

+0

logs.select_related(「winner」)[:10]不起作用,它只是返回10'PrizeVerificationCodeSMSLog',但我可以得到勝利者使用logs.winner.It沒關係,謝謝。 – Mithril