2010-09-24 5 views
0

J'ai un modèle "Item", qui a un 1: n à "Location". Moyens, il existe un historique des emplacements pour les articles.Requête Django sur l'historique

L'emplacement a un FK à "Pièce", "Pièce" à "Étage" et "Étage" à "Bâtiment". Maintenant, je veux sélectionner tous les éléments qui sont actuellement situés dans un étage spécifique.

Je pourrais le résoudre avec une compréhension de liste, mais y a-t-il une meilleure façon de le résoudre avec une requête?

- Mise à jour -

Merci pour vos réponses, malheureusement, ils ne correspondent pas à l'exigence. Pour clarifier la question, voici quelques extraits de code des modèles:

class Item(models.Model): 
    [..] 

class Location(models.Model): 
    item = models.ForeignKey(Item) 
    room = models.ForeignKey(Room) 
    created_at = models.DateTimeField(auto_now_add=True) 
    [..] 


class Room(models.Model): 
     floor = models.ForeignKey(Floor) 
     [..] 

class Floor(models.Model): 
     building = models.ForeignKey(Building) 
     [..] 

class Building(models.Model): 
     [..] 

Je veux obtenir tous les éléments qui sont actuellement situé sur un sol spécifique, spécifiée par un identifiant de plancher (comme vous pouvez le voir dans les modèles , un article peut être déplacé). Merci encore.

+0

je ne vois pas (si vous enregistrez une histoire de tous les endroits où un élément a été) comment vous pouvez déterminer quel est l'emplacement ACTUEL (peut-être y-a-t-il un champ DateField ou quelque chose comme ça dans 'Location'?) –

+0

Vous avez raison, je suis désolé, il y a un champ created_at que j'ai oublié d'ajouter à l'exemple code – schneck

Répondre

0

Je ne sais pas exactement vos modèles, mais quelque chose comme ça devrait le faire:

items_on_floor_one = Item.objects.filter(\ 
        location__in=Location.objects.filter(room__floor__number=1,\ 
        room__floor__building__name='my_building')) 
+0

merci, voir ma mise à jour ci-dessus – schneck

0
items = Item.objects.filter(location__room__floor__name='building 1', location__room__floor__num=1) 
+0

aussi merci, j'ai mis à jour la question ci-dessus. – schneck