使用Django获取多个对象rest_framework RetrieveAPIView

时间:2017-03-28 17:07:22

标签: python django django-rest-framework

目前我在我店的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个以上的对象。

谢谢

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

来自RetrieveAPIView

的文档
  

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

RetrieveAPIView用于序列化并返回<​​strong> 正好一个对象 ,该方法由get_object(self)方法或查询集查询返回。

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

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

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