【Django REST framework電子商取引プロジェクトノート】第06章商品カテゴリ機能

12097 ワード

drfから返されるデータをvueインタフェースにマッピングする考え方
1、取扱商品の分類2、カタログには2つのインターフェイスがあります
  • はすべてのデータのインタフェースであり、トップページのすべての分類に用いられ、1級-2級-3級
  • である.
  • もう1つは、ある種類の分類を取得し、商品数3、商品が大類を通過するための濾過条件の濾過である.価格、販売台数のソート、ページング
  • 商品カテゴリインタフェースの開発
    1、商品カテゴリのシーケンス化:
    class CategorySerializer(serializers.ModelSerializer):
        """
               
        """
        class Meta:
            model = GoodsCategory
            fields = "__all__"
    
    

    2、分類を選別する
    class CategoryViewSet(mixins.ListModelMixin,
                          mixins.RetrieveModelMixin,
                          viewsets.GenericViewSet):
        """
        list:           
        retrieve:          
        """
        #         ,            
        queryset = GoodsCategory.objects.filter(category_type=1)
        serializer_class = CategorySerializer
    

    3、urlの構成
    router = DefaultRouter()
    
    #          
    router.register(r'goods', GoodsAllViewSet, base_name="goods")
    
    #          
    router.register(r'category', CategoryViewSet, base_name="category")
    
    /category, vue url /categories,
    クラスのデータに2つのクラスのデータを含める方法
    Serializerに三級分類のSerializerを追加
    """
    goods   category -->       category     
                
    """
    class CategorySerializer3(serializers.ModelSerializer):
        class Meta:
            model = GoodsCategory
            fields = "__all__"
    
    
    class CategorySerializer2(serializers.ModelSerializer):
        sub_cat = CategorySerializer3(many=True)
        class Meta:
            model = GoodsCategory
            fields = "__all__"
    
    
    class CategorySerializer(serializers.ModelSerializer):
        """
          related_name sub_cat  
        """
        sub_cat = CategorySerializer2(many=True)
        class Meta:
            model = GoodsCategory
            fields = "__all__"
            
    

    ここのsub_catは,我々が自身の継承関係においてgoodsのmodels.py:と命名したためである.
        parent_category = models.ForeignKey("self", on_delete=models.CASCADE, null=True, blank=True, verbose_name="     ", help_text="   ",
                                            related_name="sub_cat")
    

    私たちがこのとき1つのクラスで手に入れた2つのクラスはたくさんあるので、many=Trueのパラメータを付けなければなりません.
    問題はまた来ました:今私たちが取得したのはすべてのcategoryで、どのように具体的な次のものを取得します.生鮮食品をクリックすると、左側に生鮮食品の下の具体的な分類が表示されます.ターゲット:リストページの詳細ページを取得し、CategoryViewSetにmixinsを継承させます.retrievemodelmixin
    ここではrestful apiの商品の詳細についての推奨に従う必要があります.
    GET /category/ID:           
    

    実はこの仕事viewsetはすでに私たちに手伝ってくれましたが、registerの登録をしました.RetrieveModelMixinを継承すればidで直接取得できます.http://127.0.0.1:8000/category/1/
    サーバのドメイン間完了の設定
    django-cors-headersのインストール
    pip install django-cors-headers
    

    インストールされたappに追加
    INSTALLED_APPS = (
        ...
        'corsheaders',
        ...
    )
    

    settingsのミドルウェアmiddlewareに追加するには、CsrfViewMiddlewareの前に配置します.
    MIDDLEWARE = [
        'corsheaders.middleware.CorsMiddleware',    #        
        'django.middleware.csrf.CsrfViewMiddleware',
        ...
    ]
    

    パラメータをtrueに追加し、ホワイトリストを設定します.
    CORS_ORIGIN_ALLOW_ALL = True
    CORS_ORIGIN_WHITELIST = (
        '127.0.0.1:3000'
    )
    
    view page vue
        page_query_param = "page"
    

    パラメータtop_categoryは私たちの最初のレベルです.これは私たちのパラメータのid値を転送するので、バックグラウンドではcategoryのフィルタとしてどのようにして1級分類のすべての商品goods/filters.py:class GoodsFilterを取得するかを組み合わせる必要があります.
     top_category = filters.NumberFilter(method="top_category_filter")
    
        def top_category_filter(self, queryset, name, value):
            return queryset.filter(Q(category_id=value) |
                                   Q(category__parent_category_id=value) |
                                   Q(category__parent_category__parent_category_id=value))
    

    次にqueryset returnをpriceminに戻し、pricemaxは私たちのフロントエンドコードと一致するので、goods/filters.pyのフロントエンドと一致するページングデータにcount値が追加されます.
    ページングsizeがフロントエンドと一致するように設定
    class GoodsPagination(PageNumberPagination):
        """
              
        """
    
        page_size = 12
        page_size_query_param = 'page_size'
        page_query_param = 'page'
        max_page_size = 100