django rest framework带有多个查找参数的自定义视图集检索

django rest framework带有多个查找参数的自定义视图集检索,django,django-rest-framework,django-rest-viewsets,Django,Django Rest Framework,Django Rest Viewsets,我有两种型号,A和B 型号看起来像 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)

我有两种型号,A和B

型号看起来像

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//B/slug>/$

我浏览了Django Restframework文档,发现我们可以添加自定义url,比如(.I不知道如何创建上面的访问url模式

如何像那样定制

编辑: 我已经解决了我的问题。我找到了类似的问题解决方案。感谢您的回复。

在您的URL.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)),
]

我认为您正在寻找的是一种制作嵌套URL的方法

DRF doc推荐的方式是使用此软件包:

用法示例:

首先创建视图集:

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嵌套路由器注册视图集:

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

您好@Diego Vinicius,谢谢您的回复。我想您还没有明白我的问题。我已经注册了我的viewset url根目录,如/api/A。默认情况下,它提供列表、创建、检索更新等。我想要的是,我想根据url自定义检索功能。如果api/A/Provider,它将返回有关的信息如果api/A//B/提供了,那么它将提供关于B的信息。非常感谢@Brunoop。我实际上看起来像这样。