Django QuerySet命令

Mar*_*tin 18 django django-models

我是django和python的新手,但我开始掌握一些事情.我认为.

我有这个问题,我似乎无法找到答案.(虽然我认为这很简单,限制因素是我的谷歌技能和缺乏python/django知识)

场景:

用户可以选择在他或她选择的任何数量的商店接收临时职位空缺.

我想提供一个仅按DateField排序的即将开始的职位空缺(StoreEvents)列表.

Example: 
    Store A - 2009-04-20 
    Store B - 2009-04-22
    Store A - 2009-04-23
Run Code Online (Sandbox Code Playgroud)

Atm我很难提出按商店排序的数据,然后按日期排序,因为我显然是通过Store模型访问StoreEvents.

Example:
    Store A - 2009-04-20
    Store A - 2009-04-23
    Store B - 2009-04-22
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:是否可以创建一个看起来像第一个示例的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')
Run Code Online (Sandbox Code Playgroud)

编辑:

以下SQL可以解决问题,但我仍然无法弄清楚如何在django中执行此操作:

SELECT *
FROM store_storeevent
WHERE store_id
IN (
    SELECT store_id
    FROM profile_userstore
    WHERE user_id =1
)
ORDER BY date
Run Code Online (Sandbox Code Playgroud)

Har*_*old 42

所有用户按日期排序:

queryset = StoreEvent.objects.all().order_by('-date')
Run Code Online (Sandbox Code Playgroud)

要按用户过滤:

queryset = StoreEvent.objects.filter(stores__user=request.user).order_by('-date')
Run Code Online (Sandbox Code Playgroud)


Mar*_*tin 6

感谢您的帮助,终于弄清楚了:

qs = StoreEvent.objects.filter(
    store__in=Store.objects.filter(
        available_staff__in=UserStore.objects.filter(user=user)
    )
).order_by('date')
Run Code Online (Sandbox Code Playgroud)

它会导致3个SQL SELECT,但能达到目的...

  • 您应该能够使它更简单:qs = StoreEvent.objects.filter(store__available_staff__user = user).order_by('date')` (2认同)