web-dev-qa-db-ja.com

Django QuerySetの順序

私はDjangoとpythonの両方に慣れていませんが、物事を把握し始めています。私は思います。

私はこの問題を抱えており、それに対する答えを見つけることができないようです。 (私はそれが本当に単純であり、制限要因は私のグーグルスキルとPython/Djangoの知識の欠如であると思いますが)

シナリオ:

ユーザーは、選択した任意の数の店舗で一時的な求人を受け取ることを選択できます。

DateFieldのみでソートされた今後の求人(StoreEvents)のリストを提示したいと思います。

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
18
Martin

あなたの助けてくれてありがとう、ついにそれを理解しました:

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

結果として3つのSQLSELECTが発生しますが、トリックは実行されます...

5
Martin

すべてのユーザーの日付順:

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

ユーザーでフィルタリングするには:

queryset = StoreEvent.objects.filter(stores__user=request.user).order_by('-date')
40
Harold
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')
1