2009-04-17 13 views
13

Soy nuevo en django y python, pero estoy empezando a comprender las cosas. Creo.Orden Django QuerySet

Tengo este problema y parece que no puedo encontrar una respuesta. (Aunque supongo que es muy simple y los factores limitantes son mis habilidades de Google y la falta de pitón conocimiento/django)

El escenario:

un usuario puede optar por recibir ofertas de trabajo temporales en cualquier número de tiendas él o ella elige.

Me gustaría presentar una lista de las próximas vacantes de trabajo (StoreEvents) ordenadas solo por el DateField.

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

Atm estoy pegado con la presentación de los datos ordenados por primera tienda a continuación, por fecha, ya que estoy, obviamente, con el acceso a StoreEvents a través del modelo de tienda.

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

Así que mi pregunta es: ¿Es posible crear un QuerySet que se ve como el primer ejemplo y cómo lo hago?

ejemplos de modelos relacionados incluyen:

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') 

Editar:

El siguiente código SQL hace el truco, pero todavía no puede encontrar la manera de hacerlo en Django:

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

Respuesta

3

Gracias por su ayuda chicos, finalmente averigüé:

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

se traduce en 3 SQL SELECCIONA, pero el truco es ...

+2

. Debería poder hacerlo más simple: 'qs = StoreEvent.objects.filter (store__available_staff__user = user) .order_by ('fecha') ' – Anentropic

33

Ordenar por fecha para todos los usuarios:

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

Para filtrar por el usuario:

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

Gracias Harold, pero eso me daría StoreEvent ordenado por fecha. Necesito buscar solo los de interés para el usuario controlado por el modelo de UserStore. – Martin

+0

Actualicé mi respuesta. – Harold

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

o más amablemente

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

Gracias Andrea, pero parece que no lo hace, aunque creo que está cerca. Ambos ejemplos dan como resultado un conjunto de consulta vacío aunque haya eventos enumerados para las tiendas seleccionadas por el usuario en la pregunta – Martin

Cuestiones relacionadas