2017-09-24 1 views
0

django-rest-frameworkを使用しています。 ProductSerializerHyperlinkedIdentityFieldを使って各商品アイテムにURLフィールドを追加したいのですが、何か問題があると言います。
ビュー名 "api:products-list"を使用してハイパーリンク関係のURLを解決できませんでした。 APIに関連するモデルを含めることができなかったか、このフィールドにlookup_field属性を正しく設定していない可能性があります。
私は正しいことを指定しているので、なぜそれが起こるのか分からず、うまくいくはずです。手伝ってくれてありがとう!

urls.pyエラー:ビュー名「api:products-list」を使用してハイパーリンク関係のURLを解決できませんでした

urlpatterns = [ 
url(r'^admin/', admin.site.urls), 
url(r'^', include('catalog.urls', namespace='blog')), 
url(r'^api/', include('catalog.api.urls', namespace='api')), 
] 

カタログ/ API/urls.py

urlpatterns = [ 
    url(r'^categories/$', CategoryListAPIView.as_view(), name='categories-list'), 
    url(r'^products/$', ProductListAPIView.as_view(), name='products-list'), 
    url(r'^products/(?P<pk>\d+)/$', ProductDetailAPIView.as_view(), name='product-detail'), 
    url(r'^products/(?P<pk>\d+)/edit/$', ProductUpdateAPIView.as_view(), name='product-update'), 
    url(r'^products/(?P<pk>\d+)/delete/$', ProductDeleteAPIView.as_view(), name='product-delete'), 
    url(r'^categories/(?P<pk>\d+)/$', CategoryDetailAPIView.as_view(), name='category-detail'), 
    url(r'^categories/(?P<pk>\d+)/edit/$', CategoryUpdateAPIView.as_view(), name='category-update'), 
    url(r'^categories/(?P<pk>\d+)/delete/$', CategoryDeleteAPIView.as_view(), name='category-delete') 
] 

カタログ/ API/serializers.py

class ProductSerializer(serializers.ModelSerializer): 
    url = serializers.HyperlinkedIdentityField(
     view_name='api:products-list', 
     lookup_field='pk', 
     ) 
    category = serializers.SerializerMethodField() 

    def get_category(self, obj): 
     return str(obj.title) 

    class Meta: 
     model = Product 
     fields = (
      'url', 
      'id', 
      'title', 
      'details', 
      'slug', 
      'category', 
     ) 


class CategorySerializer(serializers.ModelSerializer): 
    products_count = serializers.IntegerField() 

    class Meta: 
     model = Category 
     fields = (
      'id', 
      'title', 
      'slug', 
      'products_count', 
     ) 


class CategoryUpdateSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Category 
     fields = (
      'title', 
     ) 


class ProductUpdateSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Product 
     fields = (
      'title', 
      'details', 
      'category', 
     ) 

カタログ/ API/views.py

class CategoryListAPIView(ListAPIView): 
    queryset = Category.objects.annotate(products_count=Count('product')) 
    serializer_class = CategorySerializer 
    permission_classes = [AllowAny] 
    filter_backends = [SearchFilter, OrderingFilter] 
    search_fields = ['title', 'slug'] 


class CategoryDetailAPIView(RetrieveAPIView): 
    queryset = Category.objects.annotate(products_count=Count('product')) 
    serializer_class = CategorySerializer 
    permission_classes = [AllowAny] 


class CategoryDeleteAPIView(DestroyAPIView): 
    queryset = Category.objects.annotate(products_count=Count('product')) 
    serializer_class = CategorySerializer 
    permission_classes = [IsAdminUser] 


class CategoryUpdateAPIView(RetrieveUpdateAPIView): 
    queryset = Category.objects.annotate(products_count=Count('product')) 
    serializer_class = CategoryUpdateSerializer 
    permission_classes = [IsAdminUser] 


class ProductListAPIView(ListAPIView): 
    queryset = Product.objects.all() 
    serializer_class = ProductSerializer 
    permission_classes = [AllowAny] 
    filter_backends = [SearchFilter, OrderingFilter] 
    search_fields = ['title', 'details', 'slug', 'category__title'] 


class ProductDetailAPIView(RetrieveAPIView): 
    queryset = Product.objects.all() 
    serializer_class = ProductSerializer 
    permission_classes = [AllowAny] 


class ProductDeleteAPIView(DestroyAPIView): 
    queryset = Product.objects.all() 
    serializer_class = ProductSerializer 
    permission_classes = [IsAdminUser] 


class ProductUpdateAPIView(RetrieveUpdateAPIView): 
    queryset = Product.objects.all() 
    serializer_class = ProductUpdateSerializer 
    permission_classes = [IsAdminUser] 

答えて

0

あなたはフィールドに間違ったURL名を使用しています。 product-listの代わりにproduct-detailと言います。

product-listを使用すると、製品のpkという引数を使用して/products/の各商品アイテムをマップしようとしています。一方、product-detailは引数pkをとり、それぞれの製品が異なる独自のURLを持つため、論理と一貫しています。

+0

ありがとう、それは動作します:) –

関連する問題