Djangoで特定の順序でクエリセットを構築する方法

アルン・ラックスマン

ユーザーのプロファイルを一覧表示しようとしています。ユーザーの同じ都市のプロファイルが最初に来て、次に優先順位が州、次に国、最後に残りのプロファイルになるようにリストしたいと思います。これは私が試したことです。モデル

class Profile(models.Model):
    uuid = UUIDField(auto=True)
    user = models.OneToOneField(User)
    country = models.ForeignKey(Country, null=True)
    state = models.ForeignKey(State, null=True)
    city = models.ForeignKey(City, null=True)

views.py current_user = Profile.objects.filter(user = request.user)

profiles_city = Profile.objects.filter(city=current_user.city)
profiles_state = Profile.objects.filter(state=current_user.state)
profiles_country = Profile.objects.filter(country=current_user.country)
profiles_all = Profile.objects.all()
profiles = (profiles_city | profiles_state | profiles_country | profiles_all).distinct()

ただし、Profile.objects.all()と同じ結果が得られます。

私を助けてください。前もって感謝します

ヘマイル

渡されたパラメータに基づいてオブジェクトを順序付けるorder_byメソッドが必要QuerySetです。これはデータベースで行われます:

Profile.objects.order_by(
    'current_user__city',
    'current_user__state',
    'current_user__country',
)

編集:

あなたがでソートしたい場合はcitystatecountryの名前は、ユーザーにログインし、あなたが使用して、Pythonのレベルでこれを行うことができsorted、およびカスタムkey呼び出し可能:

from functools import partial


def get_sort_order(profile, logged_in_profile):
    # This is a simple example, you need to filter against
    # the city-state-country combo to match precisely. For
    # example, multiple countries can have the same city/
    # state name.

    if logged_in_profile.city == profile.city: 
        return 1 
    if logged_in_profile.state == profile.state: 
        return 2 
    if logged_in_profile.country == profile.country: 
        return 3
    return 4 

logged_in_profile = request.user.profile  # logged-in user's profile
get_sort_order_partial = partial(get_sort_order, logged_in_profile=logged_in_profile)

sorted(
    Profile.objects.all(),
    key=get_sort_order_partial,
)

使用して、データベースレベルで同じことをCaseしてWhenはPythonを持っているif- elif-else構文のように:

from django.db.models import Case, When, IntegerField

Profile.objects.order_by( 
    Case( 
        When(city=logged_in_profile.city, then=1), 
        When(state=logged_in_profile.state, then=2), 
        When(country=logged_in_profile.country, then=3), 
        default=4, 
        output_field=IntegerField(), 
    ) 
)         

これにより、クエリセットが作成され、すべての操作がデータベースで実行されるため、より高速になるという追加の利点もあります(SELECT CASE WHEN ...)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Djangoでクエリセットの順序を逆にする

Djangoで特定のクエリセットを取得する方法

djangoクエリセットでキーの順序を並べ替える

Gsonを特定の順序でセットをシリアル化する

djangoで2つのクエリセットを結合しますが、順序は維持しますか?

クエリセットの順序をランダム化する方法

AzureDevops:クエリでスプリントの順序を維持する方法は?

JestでASYNCリクエストの順序をテストする方法

GraphqlJavaクエリでの順序付けをサポートする方法

セットの束で特定の順序でSQLの行をグループ化する方法

Javaでの色の特定の順序のcompareToメソッドでリストをソートする方法

reactでクエリベースのURLを構築する方法

クエリセットでは、pks / idsがArrayFieldで見つかる順序でorder_byを使用します

親子の順序でyamlファイルを構築する方法は?

自動インクリメントIDフィールドに基づいてdjangoを降順でクエリセットの順序を設定するにはどうすればよいですか?

jQuery: ユーザーがリストの順序を構築できるようにする

特定の順序(ソフトウェアバージョンなど)でfloat値を使用してクエリセットを並べ替える

マトリックス内の行を特定の順序で並べ替える

異なる列名のセットで構造を構築する方法は?

djangoでクエリセットを作成する方法は?

GitHubプルリクエストのコミット順序を修正する方法

GitHubプルリクエストのコミット順序を修正する方法

Djangoのget_queryset()でクエリセットを返す方法

Django:関係を構築し、最良の方法でクエリを実行する方法は?

reactJSで特定のオブジェクトの順序を変更する方法

クラス内のプロパティ名のリストを特定の順序で取得する方法

順序付けされていないマップでデフォルトの構築されたintをインクリメントします

Djangoの属性でクエリセットをグループ化する方法

特定の順序で複数のスクリプトをロードする

TOP 一覧

  1. 1

    三項演算子良い練習の代わりとしてOptional.ofNullableを使用していますか?

  2. 2

    Spring Boot Filter is not getting invoked if remove @component in fitler class

  3. 3

    STSでループプロセス「クラスパス通知の送信」のループを停止する方法

  4. 4

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  5. 5

    ビュー用にサイズ変更した後の画像の高さと幅を取得する方法

  6. 6

    画像変更コードを実行してもボタンの画像が変更されない

  7. 7

    Three.js indexed BufferGeometry vs. InstancedBufferGeometry

  8. 8

    VisualStudioコードの特異点/ドッカー画像でPythonインタープリターを使用するにはどうすればよいですか?

  9. 9

    Python / SciPyのピーク検出アルゴリズム

  10. 10

    Ansibleで複数行のシェルスクリプトを実行する方法

  11. 11

    __init__。pyファイルの整理中に循環インポートエラーが発生しました

  12. 12

    二次導関数を数値計算するときの大きな誤差

  13. 13

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  14. 14

    androidsoongビルドシステムによるネイティブコードカバレッジ

  15. 15

    Reactでclsxを使用する方法

  16. 16

    値間の一致を見つける最も簡単な方法は何ですか

  17. 17

    Using Angular's UI-router, how can we make sure the new version of the html partial views are used, rather than the cached version?

  18. 18

    reCAPTCHA-エラーコード:ユーザーの応答を検証するときの「missing-input-response」、「missing-input-secret」(POSTの詳細がない)

  19. 19

    PyTesseractを使用した背景色のため、スクリーンショットからテキストを読み取ることができません

  20. 20

    エンティティIDを含む@RequestBody属性をSpringの対応するエンティティに変換します

  21. 21

    How to access json value by key value in freemarker?

ホットタグ

アーカイブ