Есть ли способ использовать lookup_field для viewsets (Маршрутизатор по умолчанию) вместо общего вида (Simple Router)? (DRF) - PullRequest
0 голосов
/ 10 ноября 2019

Я хочу использовать slug в качестве моего ПК, используя lookup_field . У меня ошибка: «Не удалось разрешить URL-адрес для связи с гиперссылкой, используя имя представления« service-detail ».

. Я подумал, что если я использую универсальное представление (ListAPIView или RetrieveAPIView), оно 'Я буду знать, есть ли способ сделать это с помощью Viewsets . Что означает, как это сделать, в URL-адресах я могу настроить простой маршрут, например путь ('services / slug /'). Я настроил URL (Маршрутизатор по умолчанию вместо простого маршрутизатора) , чтобы справиться с этим?

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)),
]

1 Ответ

0 голосов
/ 15 ноября 2019

Я решил больше не использовать 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'),
]
...