Django Rest Framework按url过滤数据

Han*_*nan 1 python django django-rest-framework

我想通过用户提供的 URL 过滤我的 Django Rest Framework 序列化数据。这是我的代码:

模型.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)
Run Code Online (Sandbox Code Playgroud)

视图.py:

class ListAirlineFinancialData(generics.ListAPIView):
    serializer_class = FinancialDataSerializer

    def get_queryset(self, *args, **kwargs):
        query_list = FinancialData.objects.filter(pk=airline_id)
Run Code Online (Sandbox Code Playgroud)

网址.py:

urlpatterns = [
    url(r'^api/v1/airline/(?P<pk>\d+)/$', views.ListAirlineFinancialData.as_view(), name='airline_financial_data'),
]
Run Code Online (Sandbox Code Playgroud)

我应该在视图中编码什么来过滤以下 URL 的数据。 http://localhost:8000/api/v1/airline/3/

此时 Django 给了我一个错误,名称“airline_id”未定义我可以理解它希望我传递我数据库中的 airline_id 但我真的不知道该怎么做。我应该在 views.py 中编写什么代码来过滤航空公司任何特定 ID 的所有数据。谢谢

Raj*_*bit 6

您的解决方法是正确的。但是,您的代码对读者来说似乎不明确。

例如:如果您在 FinancialData 上应用查询,那么您的 url 模式应该在 urlpath 而不是航空公司中包含财务数据。也<pk>通常用作您正在应用查询的模型的主键,而不是模型上的外键。

所以urlpattern应该像

urlpatterns = [
    url(
        r'^api/v1/financialdata/(?P<airline_pk>\d+)/$',
        views.ListAirlineFinancialData.as_view(),
        name='airline_financial_data'),
]
Run Code Online (Sandbox Code Playgroud)

和网址将是这样的: /api/v1/financialdata/1/

此外,将过滤器参数作为query_params. 在这种情况下,您的 urlpattern 将是

url(
        r'^api/v1/financialdata/$',
        views.ListAirlineFinancialData.as_view(),
        name='airline_financial_data'),
]
Run Code Online (Sandbox Code Playgroud)

你的网址将是这样的: /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'))
Run Code Online (Sandbox Code Playgroud)

最后,Django Rest Framework 非常强大且使用简单。您可以在Django Rest Framework Filtering上阅读有关过滤器的更多信息