8
votes

Récupération des enregistrements distincts basés sur une colonne sur Django

J'ai besoin de récupérer une liste d'enregistrements pour le tableau suivant avec des valeurs distinctes en ce qui concerne Nom: xxx pré>

J'ai besoin de vous débarrasser de toutes les valeurs dupliquées pour le nom et ne montre que le Suivant: P>

name                value
A ------------------ 30
B ------------------ 10
C ------------------ 20
D ------------------ 10


3 commentaires

Voulez-vous simplement la première valeur pour chaque nom, ou quoi?


Eh bien, vous devriez en choisir un, car les premières et dernières valeurs sont différentes. Voulez-vous vraiment aléatoire arbitraire?


J'ai en fait besoin de la dernière valeur. Mais pour cet exemple, j'ai mis en premier comme je pensais qu'il n'y a pas de différence.


5 Réponses :


21
votes

.Distinct () est l'outil, mais voici la syntaxe que j'ai dû utiliser: xxx

de cette façon, vous obtenez seulement une liste [A, B, C, d] des valeurs, pas les objets générés.


2 commentaires

Cela fonctionnera uniquement avec PostgreSQL. Si vous utilisez MySQL ou SQLite, vous avez mal de chance.


@Serafims. Cela fonctionne dans MySQL et SQLite. Faire distinct sur ne fonctionne pas PostgreSQL, mais la requête de cette réponse ne fait pas un distinct!



1
votes

Vous pouvez également utiliser cru comme:

Queryraw = c.Object.raw ('Sélectionnez le nom, la valeur du groupe PRJ_C par nom')

ou ajouter une commande pour avoir la valeur supérieure pour tout groupe:

Queryraw = C.ObjectS.raw ('Sélectionnez le nom, la valeur du groupe PRJ_C par nom Commande par valeur')

Dans tous les cas, vous pouvez avoir liste () d'objets.

Documentation utile ici: https://docs.djangoproject.com/ FR / 2.0 / TOCKS / DB / SQL /


0 commentaires

2
votes

problème avec SQLite distinct est-il distinct sur toutes les valeurs retournées. Pour distinct sur un nom de colonne, par exemple: «URL» pour obtenir toutes les URL uniques d'une table, mais également obtenir le reste des données, utilisez une sous-requête.

La sous-requête obtient les identifiants de l'URL et utilise ensuite cela faire une autre requête sur ces idées. Ceci n'est pas aussi rapide qu'un distinct régulier bien sûr. xxx

(au moment où les réponses précédentes sont données, Django n'avait pas encore de fonctionnalité de sous-requête.)


1 commentaires

Où dois-je inclure le nombre et la minute?



2
votes

Ce n'est pas super élégant, mais cela fait le travail d'environ une ligne:

# Fetch all rows to limit num of queries
all_rows = MyModel.objects.all()

# Query against the full list to return a list of objects
item_list = [all_rows.filter(myfield=item['myfield']).last() for item in MyModel.objects.values('myfield').distinct()]


0 commentaires

0
votes

L'utilisation de la syntaxe suivante doit résoudre votre problème. valeurs ("nom", "valeur"). Distinct ()


0 commentaires