【问题标题】:Getting Multiple Objects using Django rest_framework RetrieveAPIView使用 Django rest_framework RetrieveAPIView 获取多个对象
【发布时间】:2017-03-29 01:37:38
【问题描述】:

目前我在商店的 view.py 中有这个类

class ShopDetailAPIView(RetrieveAPIView):

    queryset = Shop.objects.all()
    serializer_class = ShopDetailSerializer
    lookup_field = 'Suburb'
    permission_classes = [IsAuthenticated]

还有我商店的 urls.py 显示这个特定的 api。

urlpatterns = [

    url(r'^$', ShopListAPIView.as_view(), name = 'list' ),
    url(r'^(?P<Suburb>\w+)/$', ShopDetailAPIView.as_view(), name = 'detail'),
]

ShopDetailAPIView 类的目的是显示存储在数据库中的数据的过滤版本。这样如果用户输入

 http://example.com/shop/locationname

链接会根据位置显示Django rest_framework api。

我面临的问题是当有多个对象时,页面返回

get() returned more than one Shop -- it returned 3!

我认为我的解决方案是将我的查询集更改为

queryset = Shop.Objects.filter(Suburb = suburb)

但是我不知道如何使用 RetreiveAPIView 来实现。

我知道有一些替代方案,例如 django-filter,可以在这种情况下完美运行。但是有什么方法可以实现我上面的代码以显示超过 3 个对象。

谢谢

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    您不能在多个实例中使用RetrieveAPIView。 但是,您可能需要一些过滤。我建议使用 url 参数以及 ListAPIView:

    http://www.django-rest-framework.org/api-guide/filtering/#filtering-against-the-url

    【讨论】:

    • 我花了一段时间才弄清楚过滤 URL 的工作原理,但谢谢!
    【解决方案2】:

    来自RetrieveAPIView的文档

    用于表示单个模型实例的只读端点。

    RetrieveAPIView 用于序列化并返回恰好一个对象,该对象由get_object(self) 方法或查询集上的查找返回。

    如果要显示/返回多个过滤对象,可以使用ListAPIView。您的过滤可以在get_queryset(self) 方法中完成,如下所示

    def get_queryset(self):
        return Shop.Objects.filter(Suburb = self.suburb)
    

    或者更好,使用drf的内置Filtering

    【讨论】:

      猜你喜欢
      • 2013-09-01
      • 2014-05-30
      • 2021-08-25
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多