fim Django QuerySet

votos
15

Eu sou novo para ambos Django e python, mas estou começando a ter uma idéia sobre as coisas. Eu acho que.

Eu tenho esse problema e eu não consigo encontrar uma resposta para ela. (Embora eu assumir que é realmente simples e os fatores limitantes são as minhas habilidades do Google e falta de python conhecimento / Django)

O cenário:

um usuário pode optar por receber vagas temporárias em qualquer número de lojas que ele ou ela escolhe.

Eu gostaria de apresentar uma relação das próximas aberturas de trabalho (StoreEvents) escolhidas por apenas o DateField.

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

Atm estou preso com a apresentação dos dados em primeiro lugar ordenadas por loja, então por data desde que eu estou, obviamente, acessando os StoreEvents através do modelo de loja.

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

Então, minha pergunta é: É possível criar um QuerySet que se parece com o primeiro exemplo e como eu faço isso?

Exemplos de modelos relacionados foram:

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:

O seguinte SQL faz o truque, mas eu ainda não consigo descobrir como fazê-lo no Django:

SELECT *
FROM store_storeevent
WHERE store_id
IN (
    SELECT store_id
    FROM profile_userstore
    WHERE user_id =1
)
ORDER BY date
Publicado 17/04/2009 em 18:20
fonte usuário
Em outras línguas...                            


3 respostas

votos
34

Ordenar por Data para todos os usuários:

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

Para filtrar por usuário:

queryset = StoreEvent.objects.filter(stores__user=request.user).order_by('-date')
Respondeu 17/04/2009 em 18:41
fonte usuário

votos
4

Obrigado pela vossa ajuda caras, finalmente descobri-lo:

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

que resulta em 3 SQL SELECT, mas faz o truque ...

Respondeu 18/04/2009 em 11:41
fonte usuário

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

ou mais graciosamente

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')
Respondeu 17/04/2009 em 19:07
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more