Mit*_*ril 5 python django django-orm django-queryset
我想使查询工作如下sql:
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
'''
Run Code Online (Sandbox Code Playgroud)
楷模:
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)
Run Code Online (Sandbox Code Playgroud)
因为 mobile_number并不总是填写Winner模型,我想要的是拥有手机号码或获得短信的赢家.所以必须加入PrizeVerificationCodeSMSLog以实现我的目的.
只有赢家很简单:
winners = models.Winner.objects.filter(lucky_draw_id=id).order_by('-created_on')[:10]
Run Code Online (Sandbox Code Playgroud)
但我不知道可以添加什么过滤器来加入PrizeVerificationCodeSMSLog.
我终于明白了如何在django中检索我想要的数据.
如果您想让A另一个B具有外键的模型限制模型A,请不要尝试使用filter().因为A不知道B,但B知道A!只是检索A基地B.
尝试
logs = PrizeVerificationCodeSMSLog.objects.filter(winner__lucky_draw_id=id).order_by('-created_on')
winners = logs.select_related("winner")[:10]
Run Code Online (Sandbox Code Playgroud)
这会生成以下查询
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;
Run Code Online (Sandbox Code Playgroud)
我不确定您的要求是什么,但您可能想通过 Max PrizeVerificationCodeSMSLog 进行聚合
请参阅https://docs.djangoproject.com/en/1.5/topics/db/aggregation/