2009-08-19 8 views
1

Fondamentalement, j'ai une table avec un tas de clés étrangères et j'essaye d'interroger seulement la première occurrence d'une clé particulière par le champ "créé". En utilisant l'exemple Blog/Entrée, si le modèle Entry a une clé étrangère pour Blog et une clé étrangère pour Utilisateur, alors comment puis-je construire une requête pour sélectionner toutes les Entrées dans lesquelles un Utilisateur particulier a écrit le premier pour les différents Blogs?Comment faire une requête Django pour la première occurrence d'une clé étrangère dans une colonne?

class Blog(models.Model): 
    ... 

class User(models.Model): 
    ... 

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

Je suppose qu'il ya quelque chose de magique que je suis absent pour sélectionner les premières entrées d'un blog et que je peux simple filtre plus bas à un utilisateur particulier en ajoutant:

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

Mais peut-être il y a quelques d'autres manière plus efficace. Merci!

Répondre

1

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

Fondamentalement commande par id (le plus bas au plus élevé), et le couper en tranches pour obtenir que le premier coup du QuerySet.

Je n'ai pas de Django installer disponible dès maintenant pour tester ma ligne, donc s'il vous plaît vérifier si la documentation en quelque sorte que j'ai un type ci-dessus:

order by

limiting querysets

Soit dit en passant , note intéressante sur la section «limitant les jeux queysets»:

Pour récupérer un seul objet plutôt qu'un li st (par ex. SELECT foo FROM bar LIMIT 1), utilisez un index simple à la place d'une tranche. Par exemple, cela revient la première entrée dans la base de données, après entrées de commande par ordre alphabétique par titre:

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

EDIT: Ok, c'est le meilleur que je pouvais arriver à ce jour (après le vôtre et mon commentaire). Il ne renvoie pas les objets Entrée, mais ses identifiants comme entry_id.

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

Je vais continuer à la recherche d'une meilleure façon.

+0

je l'ai mentionné qu'un utilisateur peut écrire pour plusieurs blogs. Ainsi, la limite ne montre que la première entrée que l'utilisateur a jamais écrite. Je veux être en mesure de saisir toutes les entrées que l'utilisateur a écrit qui sont les premières entrées pour un blog. –

+0

Je vois, ma réponse ne fonctionne pas dans ce cas, et je ne peux pas avoir quelque chose qui fonctionne uniquement avec les méthodes queryset ... values ​​() et annotate() ne fonctionnent pas ensemble comme je m'y attends, et je ne peut pas traduire le SQL brut que je sais qu'il va fonctionner dans ORM de Django. Pardon :( – inerte

0

ne peut pas tester dans ce moment particulier

Entry.objects.filter(user=user).distinct("blog").order_by("id") 
Questions connexes