他の表項目を使用してフィルタリング[202,1091]


  今回も,現在進行中のクローンプロジェクトにおける難点について述べる.
簡単に言えば、テーブル内のアイテムではなく、テーブル内のアイテムをフィルタする方法です.
<ディレクトリ>
1.スタート
2.解決プロセス
3.解決方法

1.スタート


まず問題の原因を説明してから、次のように話します.

  進行中のプロジェクトモデリングを上図に示します.私たちがしなければならないフィルタリングは、SubCategoryのmain category idを使用して製品をフィルタリングすることです.
ただし、テーブル内のアイテムではなく、テーブル内のアイテムをフィルタする方法はわかりません.
本当にいろいろな方法を試したことがあるようです.たとえば、set.all()メソッドを使用して、逆参照製品を使用します.subcategory.main category idでアクセスしてみます.

2.解決プロセス


  方法が見つからないのでmain category idではなく、製品のsub category idでフィルタリングすることをお勧めします.プロジェクトを一緒に行ったあるメンバーが再考の意見を出し、Djangoの公式文書をめくる際にダブルベーススコア()で解決できるという意見を出してGoogle化しました.
しかし、私たちが使いたい方法の例が見つからず、本当にずっとシャベルをしています.△4時間から5時間ぐらい、そのために三人で顔を合わせて悩んだことがある.

3.解決方法


  最後にこのような試みを経て、ついに解決策を見つけた.方法は以下の通りである.
related_products = Product.objects.filter(sub_category__main_category_id = main_id)
この表(我々の場合はProduct Table)では、Forign Keyを有する項目により、フィルタリングする項目(我々の場合はmain categroy id)をダブルベーススコア()に接続すればよい.
この方法で、接続されたテーブル内のアイテムをフィルタできます.
  上記の表の項目にフィルタリングする理由を簡単に説明すると、製品の詳細ページを表示するときに関連商品を推奨するサービスを提供したいと思います.我々の場合,関連商品として同じmain categoryを持つ商品を推薦するために,このような試みを行った.
ちなみに、私たちが行ったプロジェクトの詳細ページコードは以下の通りです.
class DetailView(View):
    def get(self, request, product_id):
        try:
            if not Product.objects.filter(id = product_id).exists():
                return JsonResponse({'MESSAGE' : 'NOT FOUND'}, status = 404)
            
            product = Product.objects.get(id = product_id)

            main_id          = product.sub_category.main_category_id
            related_products = Product.objects.filter(sub_category__main_category_id = main_id)

            if related_products.count() < 10:
                related_products = list(related_products)
            else:
                related_products = random.sample(list(related_products), 10)
            
            selected_products = [{
                    "image_url" : current_product.productimage_set.first().image_url,
                    "price"     : current_product.price,
                    "name"      : current_product.name,
                    } for current_product in related_products]

            return JsonResponse(
                {
                    'id'                : product.id,
                    'name'              : product.name,
                    'price'             : product.price,
                    'discount'          : product.discount,
                    'sales_unit'        : product.sales_unit,
                    'weight'            : product.weight,
                    'shipping_type'     : product.shipping_type,
                    'origin'            : product.origin,
                    'package_type'      : product.package_type,
                    'infomation'        : product.infomation,
                    'created_at'        : product.created_at,
                    'updated_at'        : product.updated_at,
                    'sub_category'      : product.sub_category.name,
                    'main_category'     : product.sub_category.main_category.name,
                    'menu'              : product.sub_category.main_category.menu.name,
                    'image_list'        : [img.image_url for img in product.productimage_set.all()],
                    'allergy_list'      : [allergies.name for allergies in product.allergy.all()],
                    'selected_products' : selected_products,
                }, status = 200
            )

        except KeyError:
            return JsonResponse({'MESSAGE' : 'KEY_ERROR'}, status = 400)
  特におすすめ商品を10種類程度に暴露したい場合、10種類未満の関連商品のためにコードを作成したものもあり、上記のコードの10-14行目を参考にすることができます.
推奨商品についてはfor文を用いて繰り返し,List理解を用いた.今はまだリストを書くのが苦手なので、同じメンバーで書きました.しかし、全体の論理は私が編んだもので、詳細ページでは私の好きな部分のようです.
昨日を基準にして、最初のプロジェクトが終わりました.これについて、ブログ記事をもう一つ送りたいと思います.
それはここまでです.