[Django REST 프레임워크 전자상거래 프로젝트 노트] 제08장 상품 상세 페이지와 소장 기능

22600 단어 Django
상품 상세 정보 페이지 인터페이스 실현
왼쪽 상품 윤방도 & 상품 상세 설명, 운임, 재고량 인기 상품을 다른 URL에 넣으면 계승된 안에 이mixins를 추가하면 됩니다.RetrieveModel Mixin 하면 됩니다.
class GoodsAllViewSet(CacheResponseMixin,
                      mixins.ListModelMixin,
                      mixins.RetrieveModelMixin,
                      viewsets.GenericViewSet):

Serializer 보기, 외부 키를 가리키는 Goodsimage
외부 키 형식의 필드 Serializer를 어떻게 실행합니까?중첩된 사용을 하다.
class GoodsImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = GoodsImage
        fields = ("image", )


class GoodsSerializer(serializers.ModelSerializer):
    """
    list all goods
    """
    category = CategorySerializer()
    images = GoodsImageSerializer(many=True)  #         
    class Meta:
        model = Goods
        fields = "__all__"


상품 상세 페이지를 완성하면 저희 vue의 원본 코드를 분석할 수 있습니다.구성 요소는 제품DetailproductDetail.vue입니다.
   created () {
        this.productId = this.$route.params.productId;
        var productId = this.productId
        if(cookie.getCookie('token')){
          getFav(productId).then((response)=> {
            this.hasFav = true
          }).catch(function (error) {
            console.log(error);
          });
        }
        this.getDetails();
    },

목록 페이지가 어떤 세부 정보 페이지로 넘어갈 때, vu router 안에 있는 제품 ID가 router 안에 있는 제품 detail을 통해 전달됩니다src/router/index.js 구현:
           path: 'productDetail/:productId',
           name: 'productDetail',
           component: productDetail,
           meta: {
             title: '    ',
             need_log: false
           }

인기 상품 인터페이스 실현
상품 굿즈의 한 필드는 잘 팔리는지 여부다.잘 팔리는 제품을 얻으려면 Filter에 ishotgoods/filters.py를 추가하면 추가된 것을 볼 수 있습니다.src/views/productDetail/hotSales.vue: 이것은create에서 getHotSales를 호출했습니다
	getHotSales() { //      
              getGoods({
                is_hot:true
              })
                .then((response)=> {
                    console.log(response.data)
                    this.hotProduct = response.data.results;

                }).catch(function (error) {
                    console.log(error);
                });
            }

실제로는 getGoods 인터페이스를 호출했습니다. 매개 변수 is 만 설정되어 있습니다.hot는true일 뿐입니다. 되돌아오는 json 값은response 데이터에 넣고, 우리의 데이터는result에 넣습니다.
반환된 json 형식:
{
    "count": 3,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 102,
            "category": {
                "id": 55,
                "name": "    ",
                "code": "    ",
                "desc": "",
                "category_type": 2,
                "is_tab": false,
                "add_time": "2018-02-14T03:45:05.659267",
                "parent_category": 40
            },
        }
    }

사용자 모음집 인터페이스 구현
이것은 사용자 조작 기능에 속하기 때문에 사용자 에 조작할 것입니다operation에서 소장하는 인터페이스는viewset을 계승하고 소장create를 추가하며 소장destroy를 삭제합니다user_operation/views.py
class UserFavViewSet(viewsets.GenericViewSet,
                     mixins.CreateModelMixin,
                     mixins.ListModelMixin,
                     mixins.DestroyModelMixin):
    """
    list:             
    retrieve:               
    create:         
    """
    # queryset = UserFav.objects.all()
    permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
    # serializer_class = UserFavSerializer
    authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)

    lookup_field = "goods_id"

    def get_queryset(self):
        return UserFav.objects.filter(user=self.request.user)

    def get_serializer_class(self):
        if self.action == "list":
            return UserFavDetailSerializer
        elif self.action == "create":
            return UserFavSerializer

        return UserFavSerializer
user_operation/serializers.py
class UserFavDetailSerializer(serializers.ModelSerializer):
    goods = GoodsSerializer()

    class Meta:
        model = UserFav
        fields = ("goods", "id")

class UserFavSerializer(serializers.ModelSerializer):
    """
               
    """

    #         DRF  :CurrentUserDefault
    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )

    class Meta:
        model = UserFav

        validators = [
            UniqueTogetherValidator(
                queryset=UserFav.objects.all(),
                fields=("user", "goods"),
                message="   "
            )
        ]

        fields = ("user", "goods", "id")

상응하는 URL을 urls에 설정합니다.py중
#        url
router.register(r'userfavs', UserFavViewset, base_name="userfavs"),

어떻게 Serializer가 자동으로 현재 사용자를 채우도록 합니까?
http://www.django-rest-framework.org/api-guide/validators/#currentuserdefault
공식 문서의 REST 프레임에는 이러한 상황에서 유용할 수 있는 기본값이 포함되어 있습니다.현재 사용자의 기본 클래스를 나타내는 데 CurrentUserDefault를 사용할 수 있습니다.그것을 사용하기 위해서, 실례화된 서열화 프로그램을 사용할 때, 'Request' 는 상하문 사전의 일부분으로 제공해야 한다.
만약 Serializer에 대해 삭제된 기능을 추가하고 싶다면, 이 기록된 id를 되돌려 소장을 취소하는 것이 쉬워질 것입니다.
삭제 기능 구현
restful api를 삭제할 때 사용할 http delete 방법입니다.url 형식
userfavs/id

204는 삭제가 성공했고 2는 일반적으로 작업이 성공했다는 것을 의미한다.
사용자가 한 상품을 반복적으로 소장하는 것은 이론적으로 두 가지 소장 관계의 기록을 만들어서는 안 된다.이때django 모델의 설정 파라미터가 필요합니다.
        #               
        unique_together = ("user", "goods")

만약 우리가 중복된다면 데이터베이스는 우리에게 이상을 던져서 원래의 테이블 데이터를 비우고makemigration과migrate를 진행할 것이다
navicat을 통해 우리의 유일한 인덱스를 볼 수 있습니다
{
    "non_field_errors": [
        "   user, goods          。"
    ]
}

실제로validator에서도 UniqueTogetherValidator가 Serializer의meta 정보에서 당신의 정의를 제공했습니다
   class Meta:
        model = UserFav

        validators = [
            UniqueTogetherValidator(
                queryset=UserFav.objects.all(),
                fields=("user", "goods"),
                message="   "
            )
        ]

        fields = ("user", "goods", "id")

우리의 모델 Serializer는 모델form과 마찬가지로 모델과 밀접한 관계를 가지기 때문에 모델의 설정을 읽고 설정합니다.이validate는 메타 정보에 쓰여 있습니다. 한 필드에 작용하지 않기 때문입니다.400 오류, 반환된 오류 메시지는non 에 저장됨field_errors 중.특정 필드에 오류가 발생하면 필드의 이름을 표시합니다.

좋은 웹페이지 즐겨찾기