web-dev-qa-db-ja.com

django-リストをクエリセットに戻す

計算値に基づいて並べ替えたいレコードがいくつかあります。答えを得ました こちら ...のように:

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

次のようなProfileクラスで:

class Profile(models.Model):

    ...

    @property
    def reputation(self):
        ...

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

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

または...

何らかの方法でリストをクエリセットに変換できますか?Django docs。

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

更新/回答:

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

それが不可能なとき、(データを非正規化する必要があると思います)

53
Jiaaro

データリストをクエリに戻すことは意味がありません。クエリオブジェクトがデータを保持することはありません。データベースへのクエリを表しているだけです。リストをクエリにした場合、すべてを再度フェッチする必要があり、それは冗長であり、パフォーマンス面では非常に悪いでしょう。

できること:

  • reputationフィールドの計算方法を説明してください。データベース内のデータを何らかの方法で注文することはおそらく可能です。
  • クエリオブジェクトを必要としないようにビューを変更します。追加のフィルタリングなどを行う必要がある場合、これは順序付けの前に行う必要があります。順序付けはより少ないエントリでより短い時間を要するため(そしてデータベースから取得されるデータがより少なくなります)。テンプレートに送信する直前に機能します(クエリかリストかは関係ありません)。
21
Blixt

OK ...この投稿は古いですが、あなたができることは、リスト内のオブジェクトのすべてのidsを取得し、model.objects.filter(pk__in=list_of_ids)を実行することです

87
neolaser