[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의 원본 코드를 분석할 수 있습니다.구성 요소는 제품Detail
productDetail.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에
ishot
goods/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 중.특정 필드에 오류가 발생하면 필드의 이름을 표시합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.