错误:无法使用视图名称"api:产品列表"解析超链接关系的 URL



i使用 django-rest-framework 。我想在ProductSerializer中使用HyperlinkedIdentityField将URL字段添加到每个产品项目中,但它说有问题。我有一个错误:
无法使用视图名称" API:产品列表"来解决超链接关系的URL。您可能未能在API中包含相关模型,或者在此字段上未正确配置了lookup_field属性。
我什至不知道为什么会发生这种情况,因为我指定了正确的view_name,并且应该有效美好的。感谢您的帮助!

urls.py

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]

您在字段中使用了错误的URL名称。您想提及product-detail而不是product-list

如果您使用product-list,则它正在尝试用/products/映射每个产品,并使用该产品的参数pk映射。虽然product-detail采用参数pk,并且与逻辑也一致,因为每种产品都会具有不同的URL。

相关内容

最新更新