3

すべての日付に対して 3 つの結果を返し、結果を日付順およびクエリごとに個別の「評価」列で並べ替えたい

たとえば、私のクエリは次のようなものを返します。

Event on Dec 1st rated 36
Event on Dec 1st rated 29
Event on Dec 1st rated 12
Event on Dec 2nd rated 45
Event on Dec 2nd rated 12
Event on Dec 2nd rated 9
Event on Dec 3rd rated 118
Event on Dec 3rd rated 15
Event on Dec 3rd rated 13

これは、次のような生のSQLを使用して可能であることを知っています: SQLグループ - 制限

しかし、単一のクエリで Django ORM 内でこれを行う方法があるかどうか、または生の SQL クエリに変換する必要がある場合に、できるだけ簡単にする方法があるかどうか疑問に思っています。

編集: モデルは単純です。関連するフィールドは次のとおりです。

class Event(models.Model):
  title = models.CharField(max_length=120)
  day = models.DateField()
  score = models.SmallIntegerField()
4

1 に答える 1

1

クエリセットの結合を組み立てようとしましたが、django は次のように不平を言いました:

AssertionError
Cannot combine queries once a slice has been taken.

これはビューコードでした:

def home2(request):

    dates_qs = Event.objects.values('day').order_by('day').distinct()

    ev_qss = []
    for date in dates_qs:
        my_qs = Event.objects.filter(day=date['day']).order_by('score')[:3]
        ev_qss.append(my_qs)

    answer_qs = ev_qss[0]
    for qs in ev_qss[1:]:
        answer_qs |= qs

    return render_to_response ('home2.html',
                               {'dates_qs':dates_qs,
                                'answer_qs':answer_qs},
                               RequestContext(request))

エラーは行に対して発行されましたanswer_qs |= qs。つまり、answer_qs と qs の和集合を取得しようとしています。qs は、日付のスコアのクエリセットであり、3 つの結果に制限されています。

だから私はあなたが生のSQLで立ち往生していると思います。あなたが指摘した生のSQLの例には、いくつかのテーブルにデータがあり、すべてのデータが1つのテーブルにあるため、SQLは少し単純です。

SELECT sE.* FROM so_event AS sE
WHERE 3>(
         SELECT COUNT(*)
         FROM so_event iE
         WHERE iE.day = sE.day AND
         sE.score - iE.score < 0
)
ORDER BY sE.day ASC, sE.score DESC;

これが私たちが目指しているクエリであることがわかったので、django orm サブクエリを検索し、この SO 記事と回答に出くわしました:

サブクエリでORMをジャンゴする方法は?

これは、多くのことを言い、別の ORM (SQLAlchemy) でやりたいことを実行できる可能性があることを示唆しています。SQLAlchemy について良いことを聞いたことがあります。

于 2013-07-09T05:09:59.680 に答える