2009-04-17 19 views
13

Ich bin neu zu beiden Django und Python, aber ich beginne, die Dinge in den Griff zu bekommen. Ich denke.Django QuerySet Auftrag

Ich habe dieses Problem und ich kann nicht scheinen, eine Antwort darauf zu finden. (Obwohl ich nehme an, es ist wirklich einfach und die limitierenden Faktoren sind meine Google Fähigkeiten und den Mangel an Python/Django Wissen)

Das Szenario:

ein Benutzer entscheiden kann temporäre Stellenangebot bei einer beliebigen Anzahl von Geschäften zu empfangen er oder sie wählt.

Ich möchte eine Liste der kommenden Stellenangebote (StoreEvents) nur nach dem DateField sortiert anzeigen.

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

Atm Ich bin stecken mit den Daten präsentieren zuerst von Speicher sortieren dann nach dem Datum, da ich offensichtlich bin die Storeevents durch das Store-Modell zugreifen.

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

Also meine Frage ist: Ist es möglich, eine QuerySet zu schaffen, wie das erste Beispiel aussieht und wie kann ich es tun?

Beispiele für verwandte Modelle enthalten:

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:

Die folgende SQL funktioniert der Trick, aber ich kann immer noch nicht herausfinden, wie es in django zu tun:

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

Antwort

3

Vielen Dank für Ihre Hilfe Jungs, dachte, es endlich aus:

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

es ergibt 3 SQL SELECTs aber tut den Trick ...

+2

Sie sollten es einfacher machen können: 'qs = StoreEvent.objects.filter (store__available_staff__user = user) .order_by ("Datum") ' – Anentropic

33

Sortieren nach Datum für alle Benutzer:

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

Vom Benutzer zu filtern:

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

Danke, Harold, aber das würde mir jedes StoreEvent nach Datum sortieren lassen. Ich muss nur diejenigen abrufen, die für den Benutzer von Interesse sind, der vom UserStore-Modell gesteuert wird. – Martin

+0

Ich habe meine Antwort aktualisiert. – Harold

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

oder mehr gnädig

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

Danke Andrea, aber das scheint es nicht zu tun, obwohl ich denke, es ist knapp. Beide Beispiele führen zu einem leeren Abfrage-Set, obwohl für die vom Benutzer in Frage gestellten Stores aufgelistete Ereignisse aufgelistet sind. – Martin