2009-08-22 3 views
2

Si jeDjango - Comment obtenir seulement 2 objet pour une combinaison de champs avec un queryset

Model.objects.all() 

Je veux qu'un seul objet pour tout content_object = toto, object_id = N. Comment puis je faire ça? Dites que je commande par -date-temps. Si je peux obtenir un seul objet dans le jeu de requête pour tout content_type = foo, object_id = N ... il devrait être le dernier. Comment spécifier que je veux seulement 1 objet pour une combinaison de content_object et object_id?

class CheckIn(models.Model): 
    ... 
    owner = models.ForeignKey('auth.User') 
    datetime = models.DateTimeField(editable=False, auto_now=True) 

    ... 
    # This is the object that should be geocoded, hopefully 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey() 

    class Meta: 
     ordering=('-datetime',) 

Puis prendre un queryset:

checkins = CheckIn.objects.filter(
     datetime__gte=datetime.datetime.now() - 
     datetime.timedelta(hours=24), 
) 

cela peut me donner tous les checkins au cours des dernières 24 heures, mais je veux seulement 1 objet PER content_type = toto et object_id = N.

+0

Je pense que ce que vous cherchez peut-être est un meilleur soutien distinct, ce qui est actuellement disponible, mais il y a un patch pour elle: http: //code.djangoproject.com/ticket/6422 – mikl

Répondre

3

Voulez-vous trouver l'dernier modèle objet après un certain filtrage? Que voulez-vous dire par identifiant d'objet? Est-ce une clé étrangère? Ou est-ce l'ID de modèle généré automatiquement par django? Je suppose que c'est le plus tard. Dans ce cas, vous pouvez utiliser id. Cela peut vous aider (je suppose que vous avez au moins ces champs dans votre modèle: content_object, dateField):

Model.objects.filter(content_object=foo,id=N).order_by(dateField)[0] 

EDIT:

Je présente mes excuses. Eh bien, la question n'était pas ce effacer au début (et je suis un newb). Voici une approche naïve (je pense que vous voulez distincte):

d={} 
[d.setdefault(str(a.content_type)+str(a.object_id),a) for a in checkins ] 
d.values() # this gives your desired list of distinct objects 
+3

Ajoutez un chèque pour la longueur à ceci ou il explosera s'il ne correspond à aucun objet. –

+0

bien, cela pourrait en effet être la meilleure réponse pour l'instant. S'il y a un moyen plus efficace (ne pas mettre tout en mémoire/python_objects) ce serait mieux. Mais, moyen de revenir avec une solution, merci. –

Questions connexes