我想通过用户提供的URL过滤我的Django Rest Framework序列化数据。这是我的代码:
models.py:
class Airline(models.Model):
name = models.CharField(max_length=10, blank=True, null=True)
code = models.CharField(max_length=2, blank=True, null=True)
def __str__(self):
return self.name
class FinancialData(models.Model):
airline = models.ForeignKey(Airline)
mainline_revenue = models.DecimalField(max_digits=7, decimal_places=2)
regional_revenue = models.DecimalField(max_digits=7, decimal_places=2)
other_revenue = models.DecimalField(max_digits=7, decimal_places=2)
total_revenue = models.DecimalField(max_digits=7, decimal_places=2)
def __str__(self):
return str(self.mainline_revenue)
view.py:
class ListAirlineFinancialData(generics.ListAPIView):
serializer_class = FinancialDataSerializer
def get_queryset(self, *args, **kwargs):
query_list = FinancialData.objects.filter(pk=airline_id)
urls.py:
urlpatterns = [
url(r'^api/v1/airline/(?P<pk>\d+)/$', views.ListAirlineFinancialData.as_view(), name='airline_financial_data'),
]
我应该在视图中编码什么来过滤以下网址的数据。 http://localhost:8000/api/v1/airline/3/
此时Django正在给我一个错误 name&#39; airline_id&#39;未定义我可以理解它希望我传递在我的数据库中的airline_id,但我真的不知道该怎么做。我应该在views.py中写什么代码,它过滤所有航空公司任何特定id的数据。感谢
答案 0 :(得分:2)
您的解决方案方法是正确的。但是你的代码似乎对读者来说很模糊。
例如:如果您在FinancialData上应用查询,那么您的网址格式应该在urlpath而不是航空公司中包含financialdata。此外,<pk>
通常用作要应用查询的模型的主键,而不是模型上的外键。
所以urlpattern
应该像
urlpatterns = [
url(
r'^api/v1/financialdata/(?P<airline_pk>\d+)/$',
views.ListAirlineFinancialData.as_view(),
name='airline_financial_data'),
]
和网址将如下:/api/v1/financialdata/1/
此外,通常的做法是将过滤器参数传递为query_params
。在这种情况下,您的urlpattern将是
url(
r'^api/v1/financialdata/$',
views.ListAirlineFinancialData.as_view(),
name='airline_financial_data'),
]
,您的网址将如下:/api/v1/financialdata/?airline_pk=1
如果将过滤器参数作为query_params传递,您的get_queryset
会有所不同:
def get_queryset(self, *args, **kwargs):
return self.queryset.filter(airline_id=self.request.GET.get('airline_pk'))
最后,Django Rest Framework非常强大而且使用起来很简单。您可以在Django Rest Framework Filtering
上详细了解过滤器答案 1 :(得分:0)
经过数小时的研究,我已经能够找到解决方案。如果有其他人来这里寻求答案,那么我将观点改为以下内容:
show_labels