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。