Qオブジェクト[202,11001]


今週の金曜日(10月1日)までに、2つ目のプロジェクトも完成しました.プロジェクトの回顧録は後日別途ブログに掲載されます.今回、プロジェクトの過程で印象的なコードがあり、その内容を共有するためにこの文章を書いた.
今回共有する内容はタイトルで見ることができ、Q対象の活用です.
<ディレクトリ>
1.機能の実装
2.コード
3.Qオブジェクトを使用する理由

1.機能の実装


  まず、私が実現する機能は、次の画像のフィルタリング機能と同じです.

上の写真を見ると、取引明細項目に5つのラベルがあり、ラベルごとに区別に対応する項目をフィルタリングする機能を実現すべきです.
私たちのチームの他のチームメンバーについては、各タブのすべてのデータを同時にフロントに送信し、フロントに処理させて、他の方法で処理するのはどうだと思います.query parameterを使って機能を実現し、成功しました.

2. Code


  私が実現した機能コードは以下の通りです.
class TransactionHistoryView(View):
    @login_decorator
    def get(self, request):

        type_id = request.GET.get("type_id", None)
        q = Q()

        if type_id:
            q = Q(type=type_id)

        transactions = (
            Transaction.objects.filter(user=request.user)
            .filter(q)
            .order_by("-created_time")
        )

        return JsonResponse(
            {
                "transactions": [
                    {
                        "created_time": transaction.created_time,
                        "type": transaction.type.name,
                        "information": transaction.information,
                        "amounts": transaction.amounts,
                    }
                    for transaction in transactions
                ]
            },
            status=200,
        )
簡単に言えば、query parameterを使用するために、パラメータのキー値type idが与えられる.そしてQオブジェクト設定type idを用いてフィルタリングを行う.
論理は次のとおりです.
  • は、まずqオブジェクトに空の値を割り当てる.
  • type idがある場合、qオブジェクトはq=Q(type=type id)として再割り当てされます.
  • の後、filter(q)を用いてqオブジェクト値によりフィルタリングされる.
  • queryパラメータ値がない場合、空のqオブジェクトでフィルタリングする必要はなく、queryパラメータ値がある場合、このタイプのid値を使用してQオブジェクトでフィルタリングする.
  • これにより、コードの長さを大幅に短縮できます.

    3.Qオブジェクトを使用する理由


      Qオブジェクトを使用する理由は,コードが比較的簡潔であり,長さを減らすためである.特にquery parameterを使用しない場合は、各ラベルページのすべてのデータを送信する必要があります.これにより、重複するデータが発生する可能性があります.そこでまずquery parameterの使用を考えた.
    最初にquery parameterを使用する場合、Qオブジェクトは単独ではなくif、else文を使用しますが、現在の上のコードよりやや長く、直感的ではありません.同じ騎手モチベーションでQ相手をどう使うかという意見が出ていて、いいと思っていたので適用しました.
    ちなみにQオブジェクトフィルタリングは初めてです.Q対象に対して、and,orでフィルタリングする必要があると、非常に効率的で、後で機会があれば、よく使う考えです.
    それはここまでです.