django-rest-frameworkを使用しています。 ProductSerializer
のHyperlinkedIdentityField
を使って各商品アイテムに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]
ありがとう、それは動作します:) –