68

計算値に基づいてソートしたいレコードがいくつかあります。ここで答えを得ました...そのように:

sorted(Profile.objects.all(), key=lambda p: p.reputation)

次のような Profile クラスで:

class Profile(models.Model):

    ...

    @property
    def reputation(self):
        ...

残念ながら、ジェネリック ビューはクエリセット オブジェクトを予期しており、リストを指定するとエラーがスローされます。

クエリセットを返すこれを行う方法はありますか

また...

どういうわけかリストをクエリセットに変換できますか? django docs でそのようなものを見つけることができませんでした。

データを非正規化しないことを望んでいますが、必要に応じて非正規化すると思います。

更新/回答:

クエリセットを取り戻す唯一の方法は、すべてのロジックをSQLクエリに入れることができる場合です。

それが不可能な場合は、(私が思うに) データを非正規化する必要があります

4

2 に答える 2

109

わかりました...この投稿は古いですがids、リスト内のすべてのオブジェクトを取得してから、model.objects.filter(pk__in=list_of_ids)

于 2011-01-25T05:40:17.460 に答える
26

データ リストをクエリに変換しても意味がありません。クエリ オブジェクトがデータを保持することはありません。データベースへのクエリを表すだけです。リストをクエリにすると、すべてを再度取​​得する必要があり、冗長であり、パフォーマンスが非常に悪くなります。

できること:

  • reputationフィールドの計算方法を説明します。データベース内のデータを何らかの方法で順序付けることはおそらく可能です。
  • クエリ オブジェクトを必要としないようにビューを変更します。追加のフィルタリングなどが必要な場合は、順序付けの前にこれを行う必要があります。これは、エントリが少ないほど順序付けにかかる時間が短くなるためです (また、データベースからフェッチされるデータも少なくなります)。したがって、フィルタリングされたクエリ オブジェクトを並べ替えに送信できます。テンプレートに送信する直前に関数を実行します (クエリかリストかを気にする必要はありません)。
于 2009-06-29T13:02:28.780 に答える