Django模型查询使用join

2024-09-23 22:21:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我想让查询按以下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
'''

型号:

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!只需检索AB


Tags: 模型idtruenumbersqlonmodelsmobile
1条回答
网友
1楼 · 发布于 2024-09-23 22:21:30

试试看

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;

我不确定您的要求是什么,但您可能希望通过Max PrizeVerificationCodeSMSLog同意

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

相关问题 更多 >