Django查询集排序

20

我对django和python都很新,但是我开始逐渐掌握了一些东西。我想。

我有这个问题,但似乎找不到答案。(虽然我认为这真的很简单,限制因素是我的谷歌搜索技巧和缺乏python/django知识)

场景:

用户可以选择接收任意数量的店铺提供的临时工作机会。

我想呈现一个按照日期字段排序的即将到来的工作职位(storeEvents)列表。

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

目前我只能按照店铺排序然后再按日期排序来呈现数据,因为我显然是通过Store模型访问StoreEvents。

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

编辑:

以下 SQL 可以解决问题,但我仍然不知道如何在 Django 中实现:

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

47

对所有用户按日期排序:

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

按用户过滤:

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

谢谢Harold,但这会给我任何按日期排序的StoreEvent。我需要获取由UserStore模型控制的感兴趣的事件。 - Martin

9
感谢大家的帮助,最终我解决了问题:
qs = StoreEvent.objects.filter(
    store__in=Store.objects.filter(
        available_staff__in=UserStore.objects.filter(user=user)
    )
).order_by('date')

这会导致三个SQL SELECT语句,但可以完成任务...


3
你应该能够更简单地完成它:qs = StoreEvent.objects.filter(store__available_staff__user=user).order_by('date') - Anentropic

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

谢谢Andrea,但这似乎并没有解决问题,虽然我猜它很接近。无论如何,您的两个示例都会导致空查询集,即使有列出的事件也是如此,这些事件是由所选商店的用户选择的。 - Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接