问题描述
如何通过传递某些参数使网址不区分大小写
例如,假设“股票”模型具有股票代码。下面的所有链接都应该找到相同的代码内容,现在它们区分大小写并尝试搜索不同的值:
- / stocks / AAPL
- / stocks / aapl
- / stocks / AaPl
views.py
rs.status()
urls.py
class StockViewSet(viewsets.ModelViewSet):
queryset = Stock.objects.all()
serializer_class = StockSerializer
lookup_field = "ticker"
@action(detail=True,methods=["get"],url_path="is",url_name="is")
def get_income_statement(self,request,*args,**kwargs):
is_qs = IncomeStatement.objects.filter(ticker=self.get_object())
serializer = IncomeStatementSerializer(is_qs,many=True)
return Response(serializer.data)
@action(detail=True,url_path="bs",url_name="bs")
def get_balance_sheet(self,requests,**kwargs):
bs_qs = BalanceSheet.objects.filter(ticker=self.get_object())
serializer = BalanceSheetSerializer(bs_qs,url_path="cf",url_name="cf")
def get_cashflows_statement(self,**kwargs):
cf_qs = Cashflowsstatement.objects.filter(self.get_object())
serializer = CashflowsstatementSerializer(cf_qs,many=True)
return Response(serializer.data)
class IncomeStatementDetail(viewsets.ModelViewSet):
queryset = IncomeStatement.objects.all()
serializer_field = IncomeStatementSerializer
class BalanceSheetDetail(viewsets.ModelViewSet):
queryset = BalanceSheet.objects.all()
serializer_field = BalanceSheetSerializer
class CashflowsstatementDetail(viewsets.ModelViewSet):
queryset = Cashflowsstatement.objects.all()
serializer_field = CashflowsstatementSerializer
models.py
router = DefaultRouter()
router.register(r"stocks",views.StockViewSet)
urlpatterns = router.urls
解决方法
使用 lookup_url_kwarg
和 lookup_field
作为
from rest_framework import viewsets
class StockViewSet(viewsets.ModelViewSet):
lookup_url_kwarg = 'ticker'
lookup_field = 'ticker__iexact'
# rest of your code
您可以参考source code of get_object(self)
,以查看DRF如何在详细视图中获取 模型对象 。