【问题标题】:Is there a way of using lookup_field to viewsets (Default router) instead of generic view (Simple Router)? (DRF)有没有一种方法可以将lookup_field 用于视图集(默认路由器)而不是通用视图(简单路由器)? (DRF)
【发布时间】: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


【解决方案1】:

我决定不再使用 Viewsets 而是使用它: views.py

class ServiceListAPIView(ListCreateAPIView):
    queryset = Service.objects.all()
    serializer_class = ServiceSerializer        

class ServiceDetailAPIView(RetrieveUpdateDestroyAPIView):
    queryset = Service.objects.all()
    serializer_class = ServiceSerializer
    lookup_field = 'slug'

urls.py

urlpatterns = [
    path('', include(router.urls)),
    path('services/', ServiceListAPIView.as_view(), name='service-list'),
    path('services/<slug>/', ServiceDetailAPIView.as_view(), name='service-detail'),
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-09
    • 2020-01-21
    • 2017-08-24
    • 2016-07-16
    • 2019-11-29
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多