首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DRF Django -使反向外键关系数据可路由

DRF Django -使反向外键关系数据可路由
EN

Stack Overflow用户
提问于 2021-08-31 08:52:03
回答 1查看 78关注 0票数 1

我有以下模型

代码语言:javascript
复制
# filename - stocks.models
class Stock(models.Model):

    ticker = models.CharField(max_length=10, unique=True, primary_key=True)
    exchange = models.CharField(default="", max_length=10)
    name = models.CharField(default="", max_length=255)
    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)

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

# filename - prices.models

from viewflow.fields import CompositeKey


class StockPrice(models.Model):
    id = CompositeKey(columns=["ticker_id", "date"])
    ticker = models.ForeignKey(
        "stocks.Stock", on_delete=models.CASCADE, related_name="stocks"
    )
    date = models.DateTimeField(default=now)
    open = models.FloatField()
    high = models.FloatField()
    low = models.FloatField()
    close = models.FloatField()
    adj_close = models.FloatField()
    volume = models.FloatField()

以下视图

代码语言:javascript
复制
class StockViewSet(viewsets.ModelViewSet):
    queryset = Stock.objects.all()
    queryset = queryset.prefetch_related("stocks")
    serializer_class = StockSerializer
    lookup_url_kwarg = "ticker"
    lookup_field = "ticker__iexact"

    # override create method to include many=True
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(
            data=request.data, many=isinstance(request.data, list)
        )
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(
            serializer.data, status=status.HTTP_201_CREATED, headers=headers
        )

#filename prices.views
class StockPriceViewSet(viewsets.ModelViewSet):
    queryset = StockPrice.objects.all()
    serializer_class = StockPriceSerializer

和以下路由器

代码语言:javascript
复制
router = routers.SimpleRouter()
router.register(r"stocks", stock_views.StockViewSet, basename="stocks")

stockprice_router = routers.NestedSimpleRouter(router, r"stocks", lookup="stocks")
stockprice_router.register(r"price", price_views.StockPriceViewSet)

urlpatterns = [
    path("", include(router.urls)),
    path("", include(stockprice_router))
]

该路由器来自drf-nested-routers。如何设置localhost:8000/stocks/appl/price/这样的url来显示特定股票的反向外键数据( models.StockPrice )。

目前,当我访问localhost:8000/stocks/appl/price时,我可以看到所有股票的价格。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-01 00:36:58

在这种情况下,基于选定的股票代码,覆盖get_queryset以过滤出嵌套视图集将处理的对象,如下所示:

代码语言:javascript
复制
class StockPriceViewSet(viewsets.ModelViewSet):
    queryset = StockPrice.objects.all()
    serializer_class = StockPriceSerializer

    def get_queryset(self):
        queryset = super().get_queryset()
        ticker = self.kwargs.get('stocks_ticker')
        if ticker:
            queryset = queryset.filter(ticker__ticker=ticker)
        return queryset

以上是StockPriceViewSet是否可以用作非嵌套视图集的情况。但是如果StockPriceViewSet仅嵌套在StockViewSet

代码语言:javascript
复制
class StockPriceViewSet(viewsets.ModelViewSet):
    serializer_class = StockPriceSerializer
    def get_queryset(self):
        return StockPrice.objects.filter(ticker__ticker=self.kwargs['stocks_ticker'])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68995667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档