Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Django - selectionner la dernière version d'un object

+2 votes

Je dois faire une application Django avec un modèle dont on ne peut jamais supprimer ou modifier un objet, l'idée est que si on veut modifier un objet, on crée une copie et on incrémente par exemple un numéro de version. Par exemple le modèle suivant où name est la primary key factice:

from django.db import models
class Record(models.Model):
   name = models.CharField(blank=False, null=False, max_length = 20)
   version = models.IntegerField(blank=False, null=False, default = 1)

   class Meta:
      unique_together = (('name', 'version'),)

Ma question est comment faire un queryset pour n'avoir que la derniere version du modèle pour chaque name. L'idéal étant de pouvoir encore ajouter des filter derrière.

demandé 27-Mar-2015 par benjamin (382 points)
edité 28-Mar-2015 par benjamin

J'ai édité la question pour corriger mon exemple de modèle qui était tout faux syntaxiquement, et pour mettre en gras "pour chaque name".

2 Réponses

+3 votes
 
Meilleure réponse

Tu peux utiliser distinct() qui te renverra bien un QuerySet :

Record.objects.order_by('name', '-version').distinct('name')
répondu 28-Mar-2015 par yomytho (296 points)
sélectionné 29-Mar-2015 par benjamin

Exactement ce que je demandais! Attention que cela ne fonctionne pas avec toutes les DB (sqlite par exemple), mais bien avec Postgresql que j'utilise, donc pour moi c'est bon.

+2 votes

La doc dit : https://docs.djangoproject.com/en/1.7/ref/models/querysets/#last

Un truc dans le genre :

p = Record.objects.order_by('version').last()
répondu 27-Mar-2015 par foxmask (2,772 points)

Ou plus simple avec Record.objects.latest('version').

Non, last ou latest me renvoient un seul object, moi je veux un object pour chaque "name".

Exemple:
Record.objects.create(name="foo", version=1)
Record.objects.create(name="bar", version=1)
Record.objects.create(name="bar", version=2)

Quel query me renvoie un QuerySet (pour pouvoir continuer à filtrer) avec "foo" version 1 et "bar" version 2?

...