如何解决django rest框架,使用动作装饰器添加路径以查看url中的财务报表
我需要以下URL才能在股票行情指示器代表AAPL或AMZN的股票行情指示器的地方工作,并且要代表Income_Statement。
localhost:8000/stocks/
localhost:8000/stocks/<TICKER>/
localhost:8000/stocks/<TICKER>/is/
在下面的views.py文件中,我使用的是一个视图集,该路由器和路由器会自动配置上面的前两个网址,对于第三个网址,我使用了带有methods=['get']
和url_path="is"
的动作装饰器来实现localhost:8000/stocks/<TICKER>/is/
路径。
已配置了第三个URL,但是在浏览器中输入以下URL时,出现ticker
的关键错误:localhost:8000/stocks/AAPL/is/
我在做什么错,我相信错误是在views.py
get_income_statement
函数中?
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"]
class IncomeStatement(models.Model):
ticker = models.ForeignKey(
Stock,on_delete=models.CASCADE,related_name="income_statements"
)
date = models.DateField(default=datetime.date.today)
periodicity_CHOICES = [("ANNUAL","ANNUAL"),("QUARTERLY","QUARTERLY")]
periodicity = models.CharField(
max_length=10,choices=periodicity_CHOICES,default="annually"
)
net_income_continuous_operations = models.DecimalField(
max_digits=20,decimal_places=2
views.py
class StockViewSet(viewsets.ModelViewSet):
queryset = Stock.objects.all()
serializer_class = StockSerializer
# lookup_field = "slug"
@action(detail=True,methods=["get"],url_path="is",url_name="is")
def get_income_statement(self,request,**kwargs):
income_statement = self.queryset.get(ticker=kwargs["ticker"]).select_related(
"income_statements"
)
serializer = IncomeStatementSerializer(data=income_statement)
if serializer.is_valid():
return Response(serializer.data)
else:
return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
urls.py
router = DefaultRouter()
router.register(r"stocks",views.StockViewSet)
urlpatterns = router.urls
解决方法
设置 Pallet
lookup_field = "ticker"
Update-1
class StockViewSet(viewsets.ModelViewSet):
# rest of your code
lookup_field = "ticker"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。