Y a-t-il un moyen facile de filtrer une requête Django sur la base de laquelle l'enregistrement a une valeur max / min dans une colonne? Je demande essentiellement Celles-ci A> Questions A >, mais dans le contexte spécifique de l'orme de Django. EG P> Dites avoir un modèle conçu pour stocker les valeurs historiques des numéros de téléphone de tous. P> SELECT p1.name, p1.phone, p1.created
FROM person_person p1, (
SELECT name, MAX(created) AS max_created
FROM person_person
GROUP BY name
) AS p2
WHERE p1.name = p2.name AND p1.created = p2.max_created
3 Réponses :
Vous voulez probablement simplement utiliser SQL brut ici, le RAW () code>
Méthode Manager facilite cela, vous permettant de retourner des instances de modèle de votre requête. Le seul tour est que la requête brute doit inclure la clé primaire. Cela devrait probablement fonctionner pour vous (sauf si vous avez la clé primaire définie sur quelque chose d'autre que ID code>):
Si votre backend est postgreSQL Roman Pekar a donné une bonne réponse pour Ce question Question. P>
de Documentation PostgreSQL : P> Sélectionner distinct sur (expression [ ...]) ne garde que la première rangée de
chaque ensemble de lignes où les expressions données évaluent à égale. Les
Des expressions distinctes sont interprétées en utilisant les mêmes règles que pour
Commander par (voir ci-dessus). Notez que la "première ligne" de chaque ensemble est
imprévisible sauf si la commande par est utilisée pour s'assurer que la ligne souhaitée
apparaît d'abord. P>
BlockQuote> Utilisation de l'orme Django: P>
select distinct on (name)
...
from person_person
order by name, created desc
Sa semble que sur Django, vous ne pouvez pas faire ce que vous recherchez à moins d'utiliser une requête crue SQL. Vérifiez Ce . Depuis au moment où vous ajoutez un ordre_by («créé») qui a été créé est ajouté à la sélection de la requête, le distinct ne fera rien.
Vous pouvez le faire avec Django orm, voir ma réponse: Stackoverflow.com/a/65898703/842572