python – Django模型查询使用join

前端之家收集整理的这篇文章主要介绍了python – Django模型查询使用join前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我想使查询工作如下sql

  1. sql_str = '''
  2. select * from luckydraw_winner W
  3. inner join luckydraw_prizeverificationcodesmslog L on W.id =L.winner_id
  4. where W.lucky_draw_id = %s
  5. limit 10
  6. '''
  7. @H_301_7@

楷模:

  1. class Winner(models.Model):
  2. lucky_draw = models.ForeignKey(LuckyDraw)
  3. participation = models.ForeignKey(Participation)
  4. prize = models.ForeignKey(Prize)
  5. mobile_number = models.CharField(max_length=15,null=True,default = None)
  6. class PrizeVerificationCodeSMSLog(models.Model):
  7. winner = models.ForeignKey(Winner)
  8. mobile_number = models.CharField(max_length=15,db_index=True)
  9. created_on = models.DateTimeField(auto_now_add=True)
  10. @H_301_7@

因为mobile_number并不总是在Winner模型中填充,我想要的是拥有手机号码或获得短信的赢家.所以必须加入PrizeVerificationCodeSMSLog才能达到我的目的.
只有赢家很简单:

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

但我不知道可以添加什么过滤器来加入PrizeVerificationCodeSMSLog.

我终于明白了如何在django中检索我想要的数据.

如果要让模型A受到另一个具有A外键的模型B的限制,请不要尝试使用filter().因为A不知道B,但B知道A!只需检索A基B.

最佳答案
尝试

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

这会生成以下查询

  1. 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"
  2. FROM "prizeverificationcodesmslog"
  3. INNER JOIN "winner" ON ("prizeverificationcodesmslog"."winner_id" = "winner"."id")
  4. WHERE "winner"."lucky_draw_id" = 1
  5. ORDER BY "prizeverificationcodesmslog"."created_on"
  6. DESC LIMIT 10;
  7. @H_301_7@

我不确定您的要求是什么,但您可能希望通过Max PrizeVerificationCodeSMSLog进行聚合

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

猜你在找的Python相关文章