【问题标题】:DRF: django rest framework case insensitive lookup in detail viewDRF:django rest framework case insensitive lookup in detail view
【发布时间】:2023-04-01 14:00:02
【问题描述】:

如何在传递某些参数的情况下使 url 不区分大小写

例如,假设 Stock 模型有一个股票代码。下面的所有链接都应该找到相同的代码内容,现在它们区分大小写并尝试搜索不同的值:

  • /股票/AAPL
  • /股票/aapl
  • /股票/AaPl

views.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, methods=["get"], url_path="bs", url_name="bs")
    def get_balance_sheet(self, requests, *args, **kwargs):
        bs_qs = BalanceSheet.objects.filter(ticker=self.get_object())
        serializer = BalanceSheetSerializer(bs_qs, many=True)
        return Response(serializer.data)

    @action(detail=True, methods=["get"], url_path="cf", url_name="cf")
    def get_cashflows_statement(self, requests, *args, **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

urls.py


router = DefaultRouter()
router.register(r"stocks", views.StockViewSet)
urlpatterns = router.urls

models.py

class Stock(models.Model):

    id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
    ticker = models.CharField(max_length=10, unique=True, primary_key=True)
    slug = models.SlugField(default="", editable=False)

    def save(self, *args, **kwargs):
        value = self.ticker
        self.slug = slugify(value, allow_unicode=True)
        super().save(*args, **kwargs)

    def __str__(self):
        return self.ticker

    class Meta:
        verbose_name = "stock"
        verbose_name_plural = "stocks"
        ordering = ["ticker"]

【问题讨论】:

    标签: django django-rest-framework django-urls


    【解决方案1】:

    使用 lookup_url_kwarglookup_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 如何在详细视图中获取 模型对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-03
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      相关资源
      最近更新 更多