2009-08-19 13 views
1

Grundsätzlich habe ich eine Tabelle mit einer Reihe von Fremdschlüsseln und ich versuche nur das erste Auftreten eines bestimmten Schlüssels durch das Feld "erstellt" abzufragen. Wenn das Entry-Modell im Blog/Entry-Beispiel einen Fremdschlüssel für Blog und einen Fremdschlüssel für Benutzer hat, wie kann ich eine Abfrage erstellen, um alle Einträge auszuwählen, in denen ein bestimmter Benutzer den ersten für die verschiedenen Blogs geschrieben hat?Wie kann ich eine Django-Abfrage für das erste Auftreten eines Fremdschlüssels in einer Spalte machen?

class Blog(models.Model): 
    ... 

class User(models.Model): 
    ... 

class Entry(models.Model): 
    blog = models.Foreignkey(Blog) 
    user = models.Foreignkey(User) 

Ich gehe davon aus, es gibt einige Magie, die ich vermisst habe die ersten Einträge eines Blogs zu wählen, und das kann ich einfach Filter weiter unten auf einen bestimmten Benutzer durch Anhängen:

query = Entry.objects.magicquery.filter(user=user) 

Aber vielleicht gibt es einige andere effizientere Art und Weise. Vielen Dank!

Antwort

1

query = Entry.objects.filter(user=user).order_by('id')[0]

Grundsätzlich Reihenfolge von id (steigend), und es schneidet nur den ersten Treffer von der QuerySet zu erhalten.

Ich habe nicht ein Django jetzt verfügbar installieren meine Linie zu testen, so wenden Sie sich bitte in der Dokumentation überprüfen, ob ich irgendwie eine Art oben haben:

order by

limiting querysets

By the way , interessanter Hinweis zum 'limiting queysets' Handbuch Abschnitt:

Um ein einzelnes Objekt eher als ein li st (z.B. SELECT foo FROM bar LIMIT 1), verwenden Sie stattdessen einen einfachen Index einer Scheibe. Zum Beispiel gibt diese den ersten Eintrag in der Datenbank nach Bestell Einträge alphabetisch nach Überschrift:

Entry.objects.order_by('headline')[0]

EDIT: Ok, das ist das Beste, was ich tun konnte bisher (nach Ihnen und mein Kommentar). Es gibt keine Eintragsobjekte zurück, aber seine IDs sind entry_id.

query = Entry.objects.values('blog').filter(user=user).annotate(Count('blog')).annotate(entry_id=Min('id'))

Ich werde nach einem besseren Weg suchen halten.

+0

Ich habe erwähnt sollte, dass ein Nutzer für mehrere Blogs schreiben. Das Limit zeigt also nur den ersten Eintrag an, den der Benutzer jemals geschrieben hat. Ich möchte in der Lage sein, alle Einträge zu nehmen, die der Benutzer schrieb, die die ersten Einträge für jeden Blog sind. –

+0

Ich sehe, meine Antwort funktioniert in diesem Fall nicht, und ich bin nicht in der Lage, etwas nur mit Queryset-Methoden arbeiten ... values ​​() und annotieren() arbeiten nicht zusammen, wie ich es erwarte, und ich kann das rohe SQL, von dem ich weiß, dass es in Djangos ORM funktioniert, nicht übersetzen. Es tut uns leid :( – inerte

0

Kann es bisher nicht testen in diesem speziellen Moment

Entry.objects.filter(user=user).distinct("blog").order_by("id") 
Verwandte Themen