Django Rest Framework ViewSet 出现 404 错误

Posted

技术标签:

【中文标题】Django Rest Framework ViewSet 出现 404 错误【英文标题】:404 Error With Django Rest Framework ViewSet 【发布时间】:2018-10-01 02:02:06 【问题描述】:

我还是 Django Rest Framework 的新手,我想使用 URL 参数过滤查询集。

这是我的 models.py

class Offre(models.Model):          
    title = models.CharField(max_length=100, blank=True, default=0)
    secteur = models.CharField(max_length=50, null=True)
    idRecruteur = models.ForeignKey(Recruteur,verbose_name = "idRecruteur", on_delete=models.CASCADE, default=None)
    def __str__(self):
        return "Offre: ".format(self.title)   

这是我在 urls.py 中所做的:

router = DefaultRouter();
router.register(r'OffresByRecruteur/(?P<idRecruteur_id>\d+)/$', OffreRecruteurViewSet, base_name='inoutreports')
urlpatterns = router.urls

最后api.py

class OffreRecruteurViewSet(ModelViewSet):
    queryset = Offre.objects.all()
    serializer_class = OffreSerializer

    def get_queryset(self, *args, **kwargs):
        return self.queryset.filter(idRecruteur_id=self.request.GET.get('idRecruteur_id'))

这会生成

Using the URLconf defined in djangular.urls, Django tried these URL patterns, in this order: 
   ^scrumboard/ ^OffresByRecruteur/(?P<idRecruteur_id>\d+)/$/$ [name='inoutreports-list']
   ^scrumboard/ ^OffresByRecruteur/(?P<idRecruteur_id>\d+)/$\.(?P<format>[a-z0-9]+)/?$ [name='inoutreports-list']
   ^scrumboard/ ^OffresByRecruteur/(?P<idRecruteur_id>\d+)/$/(?P<idRecruteur>[^/.]+)/$ [name='inoutreports-detail']
   ^scrumboard/ ^OffresByRecruteur/(?P<idRecruteur_id>\d+)/$/(?P<idRecruteur>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='inoutreports-detail']
The current path, scrumboard/OffresByRecruteur/1/, didn't match any of these.

我做错了什么?

【问题讨论】:

【参考方案1】:

注册视图集的正则表达式不应以/$ 结尾。默认情况下,Rest 框架将add the slash,并且您不想要美元,因为它与字符串的结尾匹配。

router.register(r'OffresByRecruteur/(?P<idRecruteur_id>\d+)/', OffreRecruteurViewSet, base_name='inoutreports')

其次,当你得到查询集时,你应该从self.kwargs 得到idRecruteur_id。您将使用 self.request.GET 从查询字符串中获取,例如如果 URL 是 /scrumboard/OffresByRecruteur/?idRecruteur_id=1

def get_queryset(self, *args, **kwargs):
    return self.queryset.filter(idRecruteur_id=self.kwargs['idRecruteur_id']))

【讨论】:

以上是关于Django Rest Framework ViewSet 出现 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

第 5 篇:用视图集,简化你的代码

Django-rest-framework 和 django-rest-framework-jwt APIViews and validation Authorization headers

Django Rest Framework 和 django Rest Framework simplejwt 两因素身份验证

怎么安装django rest framework

django rest framework中文介绍

17-Django-Django REST framework-REST framework及RESTful简介