2014-01-15 21 views
5

ich Abfrage wie folgt SQL arbeitet machen wollen:Django Modelle Join-Abfragen verwenden

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 
''' 

Modelle:

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) 

weil mobile_number nicht immer in Winner Modell gefüllt, was ich will, ist ein Gewinner, der Handynummer hat oder wer die sms.So muss PrizeVerificationCodeSMSLog beitreten, um meinen Zweck zu machen. erhalten
Nur Gewinner ist einfach:

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

Aber ich habe keine Ahnung, welche Filter PrizeVerificationCodeSMSLog beitreten hinzugefügt werden können.


Ich habe endlich verstanden, wie ich Daten in Django abrufen möchte.

Wenn Sie Modell erhalten möchten A durch ein anderes Modell beschränkt B, die einen Fremdschlüssel zu A hat, versuchen Sie nicht filter() zu verwenden. Denn A weiß nicht B, aber B wissen A! Nur abrufen A Basis B.

+0

Sie Agregate wollen kann einen Namen in eine Beziehung einfügen, wenn Sie einen Fremdschlüssel hinzufügen, t Wenn A B durch diese benannte Beziehung kennt. Überprüfen Sie 'ForeignKey.related_name' und' ForeignKey.related_query_name' in den Dokumenten. – Raiyan

Antwort

4

Versuchen

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

Dies erzeugt folgende Abfrage

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; 

Ich bin nicht sicher, was Ihre Anforderungen sind, aber Sie können von Max PrizeVerificationCodeSMSLog

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

+0

logs.select_related ("winner") [: 10] funktioniert nicht, es gibt nur 10 'PrizeVerificationCodeSMSLog' zurück, aber ich kann den Gewinner log.sinner verwenden.Es ist alles in Ordnung, danke. – Mithril