Получение настраиваемого набора представлений django-rest-framework с несколькими аргументами поиска

У меня две модели говорят А и Б.

как выглядят модели

class A(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=1000)
    slug = models.CharField(max_length=100)

class B(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=1000)
    slug = models.CharField(max_length=100)
    A = models.foreignkey(A, models.SET_NULL, blank=true)

сериализаторы

Class ASerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
         model = A
         fields = '__all__'
         lookup_field = 'slug'
         extra_kwargs = {'url': {'lookup_field': 'slug'}}


Class BSerializer(serializers.ModelSerializer):
    class Meta:
         model = B
         fields = '__all__'

вид модели

from rest_framework import viewsets, permissions
from rest_framework.response import Response
from rest_framework.decorators import action
from .models import (A, B)
from .serializers import (ASerializer, BSerializer)


Class AViewSet(viewsets.ModelViewSet):
     queryset = A.objects.all()
     serializer_class = ASerializer
     permission_classes =                           (permissions.DjangoModelPermissionsOrAnonReadOnly, )
     lookup_field = 'slug'

     def retrieve(self, request, *args, **kwargs):
          instance = self.get_object()
          bs = B.objects.filter(A=instance.id)
          serializer = BSerializer(bs, many=True)

          return Response(serializer.data)

Я хочу получить доступ к URL-адресу, например

Url: ^A/<slug>/B/slug>/$

Я просмотрел документацию Django Restframework и обнаружил, что мы можем добавить настраиваемый URL-адрес, например (drf-custom-rounting. Я не понимаю, как создать шаблон URL-адреса доступа, указанный выше.

Как так настроить?

РЕДАКТИРОВАТЬ: Я решил свою проблему. Я нашел решение проблемы аналогичного типа здесь < / а>. Спасибо за ваш ответ.


person Shakil    schedule 04.07.2018    source источник


Ответы (2)


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

DRF doc рекомендует использовать этот пакет: https://github.com/alanjds/drf-nested-routers

Пример использования:

Сначала вы создаете свое представление:

Class BViewSet(viewsets.ModelViewSet):
     queryset = B.objects.all()
     serializer_class = BSerializer
     lookup_field = 'slug'

     def retrieve(self, request, a_slug=None, b_slug=None):
          a = self.get_object()
          # Now you retrieve all B related to A
          bs = B.objects.filter(A=a)
          serializer = BSerializer(bs, many=True)
          return Response(serializer.data)

Затем вы регистрируете свой набор представлений с помощью drf-nested-routers:

from rest_framework_nested import routers

from .viewsets import AViewSet, BViewSet

a_router = routers.SimpleRouter()
a_router.register(r'A', AViewSet)

b_router = routers.NestedSimpleRouter(a_router, r'B')
b_router.register(r'B', BViewSet)

urlpatterns = patterns('',
    url(r'^', include(a_router.urls)),
    url(r'^', include(b_router.urls)),
)
person Brunoop    schedule 05.07.2018
comment
Большое спасибо @Brunoop. На самом деле я выглядел примерно так же. - person Shakil; 05.07.2018

На вашем urls.py

from django.conf.urls import url, include
from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'yourregex', views.AViewSet)

urlpatterns = [
    url(r'^api/', include(router.urls)),
]
person Diego Vinícius    schedule 04.07.2018
comment
Привет, @Diego Vinicius, спасибо за ответ. Думаю, вы не поняли мой вопрос. Я уже зарегистрировал свой корень URL-адреса просмотра, например / api / A. По умолчанию он предоставляет список, создает, извлекает обновления и т. Д., Что я хочу, я хочу настроить свои функции извлечения на основе URL-адреса. скажем, если api / A / ‹slug› предоставит, тогда он вернет информацию относительно A, если api / A / ‹slug› / B / ‹slug› предоставит, тогда он предоставит информацию относительно B. - person Shakil; 05.07.2018