создание пользовательского или измененного URL-адреса с использованием маршрутизатора для метода извлечения ModelViewSet

Я хочу создать собственный или измененный URL-адрес с помощью маршрутизатора для ModelViewSet.

Текущий сценарий:

/models.py

class BlogPost(models.Model):
    title = models.CharField(max_length=300)
    description = models.TextField()
    slug = models.SlugField(max_length=300, unique=True)

/serializers.py

class BlogListSerializer(serializers.ModelSerializer):
    class Meta:
        model = BlogPost
        exclude = ('id',)

/views.py

class BlogViewSet(ModelViewSet):
    queryset = BlogPost.objects.all()
    serializer_class = BlogListSerializer

/urls.py

router = DefaultRouter()
router.register(r'blog', BlogViewSet, basename='blog')
urlpatterns = router.urls

Теперь я могу получить доступ к URL-адресу, как показано ниже:

список https://localhost:8000/blog

получить https://localhost:8000/blog/1

Как вы можете видеть, URL-адрес извлечения может быть вызван с использованием pk или id. Но я создал поле модели под названием slug и оно уникально. Мой вопрос заключается в том, как изменить URL-адрес извлечения, чтобы я мог вызывать URL-адрес извлечения, используя поле slug. Например: https://localhost:8000/blog/test-slug

Примечание. Почему я хочу создать URL-адрес с помощью slug? Ответ: Я хочу использовать URL-адреса для карты сайта.


person Rajesh Samui    schedule 17.11.2019    source источник


Ответы (2)


Если вашему API необходимо возвращать результаты, запрашивая поле slug (а не поле pk), вы можете использовать lookup_field и lookup_url_kwarg DRF.

Поиск по полю pk или id является поиском по умолчанию и упоминается в документах DRF.

https://www.django-rest-framework.org/api-guide/generic-views/

просмотры.py

class BlogViewSet(ModelViewSet):
    queryset = BlogPost.objects.all()
    serializer_class = BlogListSerializer
    lookup_field = 'slug'
    lookup_url_kwarg = 'slug'
person Zeeshan Siddiqui    schedule 17.11.2019
comment
Именно это я и искал. - person Rajesh Samui; 25.11.2019

class Blogdetail(generics.RetrieveAPIView):
    queryset = BlogPost.objects.all()
    serializer_class = BlogDetailsSerializer

    def get_object(self):
        slug = self.kwargs["slug"]
        obj = get_object_or_404(BlogPost, slug=slug)
        return obj

class BlogUrlHyperlinkedIdentityField(serializers.HyperlinkedIdentityField)

        def get_url(self, obj, view_name, request, format):
            kwargs = {
                "slug": obj.slug
            }
            return reverse(view_name, kwargs=kwargs, request=request, format=format)

class BlogListSerializer(serializers.ModelSerializer):
    url = BlogUrlHyperlinkedIdentityField("blog_detail")
    class Meta:
        model = BlogPost
       fields = [
            "url",.....]

Добавьте URL-адрес также

path('blog/<slug:slug>/', views.Blogdetail.as_view(), name='blog_detail'),
person bmons    schedule 17.11.2019