我有一个类似于此的设置 - 一个Cookbook类,它有多个食谱。
我有一个
class CookbookListCreateView(ListCreateAPIView):
permission_classes = (IsAuthenticated,)
queryset = Cookbook.objects.all()
serializer_class = CookbookSerializer
这会处理创建/列出食谱的行为。
我需要一个ListCreateView
的食谱模型,但该列表必须属于一个特定的食谱,以这种方式:
/cookbook/2/recipes
只返回在食谱中找到的食谱,其中pk为2。
如何修改ListCreateAPIView
以遵循此行为?
答案 0 :(得分:0)
这就是DRF中的“细节路线”。
class CookbookListCreateView(ListCreateAPIView):
....
@detail_route(methods=['get'])
def recipes(self, request, **kwargs):
# Do what you would do in a function-based view here
对于简单的情况就足够了,但使用nested route DRF-extensions功能的更复杂的视图是更好的解决方案。
答案 1 :(得分:0)
您可以创建新的路线/网址:
/cookbook/<cookbook_pk>/recipes
你想要的api视图:
class RecipeListCreateView(ListCreateAPIView):
permission_classes = (IsAuthenticated,)
queryset = Recipe.objects.all()
serializer_class = RecipeSerializer
def get_cookbook(self):
queryset = Cookbook.objects.all()
return get_object_or_404(queryset, pk=self.kwargs['cookbook_pk'])
def get_queryset(self):
cookbook = self.get_cookbook()
return super().get_queryset().filter(cookbook=cookbook)
def perform_create(self, serializer):
cookbook = self.get_cookbook()
serializer.save(cookbook=cookbook)
每当您需要食谱时使用get_cookbook
(例如,如上所述的perform_create
方法)