2009-04-17 6 views
13

Je suis nouveau à la fois django et python mais je commence à avoir une idée des choses. Je pense.Django QuerySet order

J'ai ce problème et je n'arrive pas à trouver une réponse. (Bien que je suppose qu'il est vraiment simple et les facteurs limitants sont mes compétences en Google et le manque de connaissances python/django)

Le scénario:

un utilisateur peut opter pour recevoir les offres d'emploi temporaire à un certain nombre de magasins il ou elle choisit.

Je voudrais présenter une liste des offres d'emploi à venir (StoreEvents) triées par DateField seulement.

Example: 
    Store A - 2009-04-20 
    Store B - 2009-04-22 
    Store A - 2009-04-23 

Atm Je suis coincé avec la présentation des données d'abord triés en magasin puis par date depuis que je suis évidemment le StoreEvents accède à travers le modèle de magasin.

Example: 
    Store A - 2009-04-20 
    Store A - 2009-04-23 
    Store B - 2009-04-22 

Donc, ma question est la suivante: Est-il possible de créer un QuerySet qui ressemble le premier exemple et comment puis-je le faire?

Exemples de modèles connexes inclus:

class Store(models.Model): 

class StoreEvent(models.Model): 
    info = models.TextField() 
    date = models.DateField() 
    store = models.ForeignKey(Store, related_name='events') 

class UserStore(models.Model): 
    user = models.ForeignKey(User, related_name='stores') 
    store = models.ForeignKey(Store, related_name='available_staff') 

Edit:

Le SQL suivant fait le tour, mais je ne peux toujours pas comprendre comment le faire dans django:

SELECT * 
FROM store_storeevent 
WHERE store_id 
IN (
    SELECT store_id 
    FROM profile_userstore 
    WHERE user_id =1 
) 
ORDER BY date 

Répondre

3

Merci pour votre aide les gars, enfin figured it out:

qs = StoreEvent.objects.filter(
    store__in=Store.objects.filter(
     available_staff__in=UserStore.objects.filter(user=user) 
    ) 
).order_by('date') 

il en résulte 3 SQL CHOISIR mais fait l'affaire ...

+2

Vous devriez pouvoir le faire plus simplement: 'qs = StoreEvent.objects.filter (store__available_staff__user = user) .order_by ('date') ' – Anentropic

33

Classement par date pour tous les utilisateurs:

queryset = StoreEvent.objects.all().order_by('-date') 

Pour filtrer par l'utilisateur:

queryset = StoreEvent.objects.filter(stores__user=request.user).order_by('-date') 
+0

Merci Harold, mais cela me donnerait n'importe quel StoreEvent trié par date. Je n'ai besoin de récupérer que ceux qui intéressent l'utilisateur contrôlé par le modèle UserStore. – Martin

+0

J'ai mis à jour ma réponse. – Harold

1
queryset = StoreEvent.objects.filter(store__in=UserStore.objects.filter(user__id=1).store).order_by('store__name', '-date') 

ou plus gracieusement

user = User.objects.get(username="foo") 
user_stores = user.stores.all() 

store_events = StoreEvent.objects.filter(store__in=user_stores).order_by('store__name', '-date') 
+0

Merci Andrea, mais cela ne semble pas le faire, même si je suppose que c'est proche. Vos deux exemples aboutissent à un jeu de requête vide même s'il existe des événements listés pour les magasins sélectionnés par l'utilisateur en question. – Martin

Questions connexes