Django QuerySet订单
我对django和python都是新手,但我开始掌握一些东西。我想 我有这个问题,似乎找不到答案。(尽管我认为这很简单,限制因素是我的谷歌技能和python/django知识的缺乏) 情景: 用户可以选择在他或她选择的任意数量的商店接受临时职位空缺 我想提供一份仅按日期字段排序的即将到来的职位空缺(StoreEvents)列表Django QuerySet订单,django,django-models,Django,Django Models,我对django和python都是新手,但我开始掌握一些东西。我想 我有这个问题,似乎找不到答案。(尽管我认为这很简单,限制因素是我的谷歌技能和python/django知识的缺乏) 情景: 用户可以选择在他或她选择的任意数量的商店接受临时职位空缺 我想提供一份仅按日期字段排序的即将到来的职位空缺(StoreEvents)列表 Example: Store A - 2009-04-20 Store B - 2009-04-22 Store A - 2009-04-23
Example:
Store A - 2009-04-20
Store B - 2009-04-22
Store A - 2009-04-23
Atm我一直坚持先按存储区排序,然后按日期排序,因为我显然是通过存储模型访问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
所有用户按日期订购:
queryset = StoreEvent.objects.all().order_by('-date')
要按用户筛选,请执行以下操作:
queryset = StoreEvent.objects.filter(stores__user=request.user).order_by('-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')
谢谢你们的帮助,伙计们,终于明白了:
qs = StoreEvent.objects.filter(
store__in=Store.objects.filter(
available_staff__in=UserStore.objects.filter(user=user)
)
).order_by('date')
它会导致3次SQL选择,但效果很好…谢谢Harold,但这会给我任何按日期排序的StoreEvent。我只需要获取由UserStore模型控制的用户感兴趣的内容。谢谢Andrea,但这似乎不起作用,尽管我猜它很接近。您的两个示例都会导致一个空查询集,即使用户选择的商店中有列出的事件,您也应该能够更简单地执行此操作:
qs=StoreEvent.objects.filter(商店可用\u员工\u用户=user)。按('date')排序。
qs = StoreEvent.objects.filter(
store__in=Store.objects.filter(
available_staff__in=UserStore.objects.filter(user=user)
)
).order_by('date')