【发布时间】:2020-03-06 13:37:08
【问题描述】:
我想通过 lookup_field 将 slug 用作我的 pk。 我遇到的错误是“无法使用视图名称“服务详细信息”解析超链接关系的 URL。
我认为如果我使用通用视图(ListAPIView 或 RetrieveAPIView),它会起作用,因为在 urls 中我可以设置一个简单的路由,如路径('services/slug/')。 但我想知道是否有办法用 Viewsets 做到这一点。这意味着我该如何设置网址 (默认路由器而不是简单路由器) 来处理这个问题?
serializers.py
class ServiceSerializer(serializers.HyperlinkedModelSerializer):
title = serializers.CharField(required=True)
slug = serializers.SerializerMethodField(read_only=True)
description = serializers.CharField(required=False)
price = serializers.IntegerField(required=True)
service_image = ServiceImageSerializer(many=True)
class Meta:
model = Service
fields = ('url', 'slug', 'title', 'description', 'price', 'service_image')
lookup_field = 'slug'
extra_kwargs = {
'url': {'lookup_field':'slug'}
}
def get_slug(self, instance):
return slugify(instance.vendor.username + "-" + instance.title)
views.py
class ServiceViewSet(viewsets.ModelViewSet):
queryset = Service.objects.all()
serializer_class = ServiceSerializer
lookup_field = 'slug'
urls.py
router = routers.DefaultRouter()
router.register('categories', CategoryViewSet)
router.register('services', ServiceViewSet)
router.register('images', ServiceImageViewSet)
urlpatterns = [
path('', include(router.urls)),
]
【问题讨论】:
-
path('categories', CategoryViewSet.as_view(dict(get='list', post='create', put='update')), name='category_view_set')为什么不呢? -
感谢您的回复!
python path('services/', ServiceViewSet.as_view({ 'get': 'list', 'post': 'create'}), name='service_view_set'), path('services/<slug>/', ServiceViewSet.as_view({ 'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'}), name='service_view_set'),我按照您的建议做了一些事情,它适用于正在使用 (services//) 的详细视图,但 它不适用于检索正常的列表视图 (services/) 对不起,我是新手。
标签: django django-rest-framework django-urls django-serializer