2009-04-17 2 views
13

Я новичок как в django, так и в python, но я начинаю понимать вещи. Я думаю.Django QuerySet order

У меня есть эта проблема, и я не могу найти ответ на нее. (Хотя я предполагаю, что это действительно просто и ограничивающие факторы являются моими навыками Google и отсутствием питона/знания Джанго)

Сценарий:

пользователь может выбрать, чтобы Получать временные проемы работы в любом количестве магазинов он или она выбирает.

Я бы хотел представить список предстоящих вакансий (StoreEvents), отсортированных только по дате.

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

Банкоматы Я застрял с представлением данных первого упорядоченные по магазину затем по дате, так как я, очевидно, доступ к StoreEvents через модель Store.

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

Так что мой вопрос: Можно ли создать QuerySet, который выглядит как первый пример и как это сделать?

Примеры родственных моделей включены:

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:

Следующая SQL делает трюк, но я до сих пор не могу понять, как сделать это в Джанго:

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

ответ

3

Спасибо за вашу помощь, ребята, наконец, понял это:

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

это приводит к 3 SQL ВЫБОР, но делает трюк ...

+2

. Вы должны быть в состоянии сделать это проще: 'qs = StoreEvent.objects.filter (store__available_staff__user = user) .order_by ('дата') ' – Anentropic

33

Порядок по дате для всех пользователей:

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

Для фильтрации пользователем:

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

Спасибо, Гарольд, но это даст мне любой StoreEvent, отсортированный по дате. Мне нужно получить только те, которые представляют интерес для пользователя, управляемого моделью UserStore. – Martin

+0

Я обновил свой ответ. – Harold

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

или более милостиво

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

Спасибо Андреа, но, похоже, это не так, хотя я думаю, что это близко. Оба этих примера приводят к пустым запросам запросов, даже если для магазинов, выбранных указанным пользователем, есть перечисленные события. – Martin

 Смежные вопросы

  • Нет связанных вопросов^_^