Django Rest Framework按网址过滤数据

时间:2017-07-22 20:18:35

标签: python django django-rest-framework

我想通过用户提供的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的数据。感谢

2 个答案:

答案 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