【问题标题】:django-rest-framework custom viewset retrive with multiple lookup argsdjango-rest-framework 自定义视图集检索多个查找参数
【发布时间】:2018-12-12 23:39:49
【问题描述】:

我有两个模型,分别是 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: ^A/<slug>/B/slug>/$

我浏览了 Django Restframework 文档,发现我们可以添加自定义 url,例如(drf-custom-rounting。我不明白如何制作上面的访问 url 模式。

如何定制这样的?

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

【问题讨论】:

    标签: django django-rest-framework django-rest-viewsets


    【解决方案1】:

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

    DRF 文档推荐的方式是使用这个包: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)),
    )
    

    【讨论】:

    • 非常感谢@Brunoop。我实际上看起来像这样。
    【解决方案2】:

    在你的 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)),
    ]
    

    【讨论】:

    • 您好@Diego Vinicius,感谢您的回复。我想你不明白我的问题。我已经注册了我的视图集 url 根,就像 /api/A 一样。默认情况下,它提供列表、创建、检索更新等我想要的,我想根据 url 自定义我的检索功能。说如果 api/A/ 提供,那么它将返回关于 A 的信息,如果 api/A//B/ 提供,那么它将提供关于 B 的信息。
    猜你喜欢
    • 2018-10-18
    • 2014-07-06
    • 2015-06-04
    • 2016-09-30
    • 2021-12-21
    • 1970-01-01
    • 2018-09-04
    • 2018-10-26
    • 1970-01-01
    相关资源
    最近更新 更多