私はPeopleのモデルを持つDjangoアプリケーションを作成しています。私は多対多の関係を使用する人々に役割オブジェクトを割り当てます。役割には名前と重みがあります。最も重い役割を果たしている人のリストを注文したいと思っています。 People.objects.order_by( ' - roles__weight')を実行すると、複数のロールが割り当てられているときに重複が発生します。Django:多対多のフィールドでモデルを注文してください
私の最初のアイデアは、と呼ばれる非正規化フィールドを追加して、最も重い役割の重みとしました。これは、新しい役割がユーザーに追加または削除されるたびに更新されます。しかし、ManyToManyFieldがDjangoで更新されるたびにカスタムアクションを実行する方法がないことが判明しました(とにかくyet)。
だから私は完全に船に乗ってこれを扱うためのカスタムフィールド、記述子、マネージャーを書くことができると思っていましたが、ManyRelatedManagerがManyToManyFieldに対して動的に作成されると非常に困難です。
私はこれを行うことができる賢明なSQLを思いついたことがあります。サブクエリ(またはいくつか)で可能だと確信していますが、互換性がないことが心配ですデータベースバックエンドのDjangoがサポートしています。
誰もこれまでにこれをやったことがありますか、それを達成する方法はありますか?
select p.*, max (r.Weight) as HeaviestWeight
from persons p
inner join RolePersons rp on p.id = rp.PersonID
innerjoin Roles r on rp.RoleID = r.id
group by p.*
order by HeaviestWeight desc
注:Pによるグループ* SQLのあなたの方言で禁止することができる。SQLでこのよう
:
これはあなたのような何かを言うことができます探している。私はDjango 1.1を実行していませんが、私はカスタムマネージャーでそのSQLを使用できます。ありがとう:) –