目前我在我店的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个以上的对象。
谢谢
答案 0 :(得分:2)
您无法在多个实例中使用RetrieveAPIView
。
但是,您可能需要一些过滤。我建议使用url参数以及ListAPIView
:
http://www.django-rest-framework.org/api-guide/filtering/#filtering-against-the-url
答案 1 :(得分:1)
用于表示单个模型实例的只读端点。
RetrieveAPIView
用于序列化并返回<strong> 正好一个对象 ,该方法由get_object(self)
方法或查询集查询返回。
如果要显示/返回多个过滤的对象,可以使用ListAPIView。您的过滤可以使用get_queryset(self)
方法完成,具体如下
def get_queryset(self):
return Shop.Objects.filter(Suburb = self.suburb)
或者更好,使用drf的内置Filtering。