【问题标题】:Django models queries use joinDjango 模型查询使用连接
【发布时间】:2014-02-03 10:20:18
【问题描述】:

我想让查询按照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

【问题讨论】:

  • 您可以在添加外键时将名称放入关系中,然后A将通过该命名关系知道B。查看文档中的ForeignKey.related_nameForeignKey.related_query_name

标签: python django django-queryset django-orm


【解决方案1】:

试试

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/

【讨论】:

  • logs.select_related("winner")[:10] 不起作用,它只返回 10 PrizeVerificationCodeSMSLog,但我可以使用 logs.winner 获得胜利者。没关系,谢谢。跨度>
猜你喜欢
  • 2018-08-17
  • 2014-04-25
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多