APIView阻止另一个视图工作

时间:2017-02-09 15:40:32

标签: django django-views

我有以下urlpatterns和APIViews来获取JSON数据。它们都应该工作并返回数据,除了最后一个'pollutant_daily_means'。当我删除'site_daily_means'的视图时,'pollutant_daily_means'会返回它应该的数据。

如果我只删除它上面的'site_daily_means',那么它仍然不起作用,所以它必须与site_daily_means视图以某种方式干扰。

url(r'^api/daily-means/$', views.daily_means.as_view(), name='daily_means'),
url(r'^api/daily-means/(?P<url>\w+)/$', views.site_daily_means.as_view()),
url(r'^api/daily-means/(?P<poll>\w+d+)/', views.pollutant_daily_means.as_view()),

class daily_means(APIView):
    def get(self, request):
        means = DailyMean.objects.all()
        serializer = DailySerializer(means, many=True)
        return Response(serializer.data)

class site_daily_means(APIView):
    def get(self, request, url):
        means = DailyMean.objects.filter(url=url)
        serializer = DailySerializer(means, many=True)
        return Response(serializer.data)

class pollutant_daily_means(APIView):
    def get(self, request, poll):
        means = DailyMean.objects.filter(poll=poll)
        serializer = DailySerializer(means, many=True)
        return Response(serializer.data)

有人可以从上述网址和观点中看到任何明确的理由吗?

1 个答案:

答案 0 :(得分:1)

匹配(?P<poll>\w+d+)的任何内容都将由(?P<url>\w+)首先匹配,因此site_daily_means视图将会运行。

您可以通过更改pollutant_daily_means的网址格式来解决此问题,例如到:

url(r'^api/daily-means/poll/(?P<poll>\w+d+)/', views.pollutant_daily_means.as_view()),

请注意,在这种情况下可能不需要\w+\d+。您可以将其简化为\w+,因为您已经在DailyMean字段上过滤了poll