Django Rest Framework ViewSet 出现 404 错误
404 Error With Django Rest Framework ViewSet
我还是 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.
我做错了什么?
用于注册视图集的正则表达式不应以 /$
结尾。默认情况下,Rest 框架将 add the slash,您不需要美元,因为它匹配字符串的末尾。
router.register(r'OffresByRecruteur/(?P<idRecruteur_id>\d+)/', OffreRecruteurViewSet, base_name='inoutreports')
其次,当你得到queryset时,你应该从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 的新手,我想使用 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.
我做错了什么?
用于注册视图集的正则表达式不应以 /$
结尾。默认情况下,Rest 框架将 add the slash,您不需要美元,因为它匹配字符串的末尾。
router.register(r'OffresByRecruteur/(?P<idRecruteur_id>\d+)/', OffreRecruteurViewSet, base_name='inoutreports')
其次,当你得到queryset时,你应该从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']))