DRF list endint返回404,而db中存在对象



当我试图检索对象列表时出现了一些问题。下面是我的代码(为了简单起见,我已经简化了)

# Models.py
class TournamentType(models.Model):
name = models.CharField(max_length=255)
# Serializers.py
class TournamentTypeSerializer(serializers.ModelSerializer):
class Meta:
model = models.TournamentType
fields = ('id', 'name')
# Views.py
class TournamentTypeViewSet(ReadOnlyModelViewSet):
queryset = TournamentType.objects.all()
serializer_class = serializers.TournamentTypeSerializer
# Urls.py
if settings.DEBUG:
router = DefaultRouter()
else:
router = SimpleRouter()
router.register("tournament_types", views.TournamentTypeViewSet)
app_name = "tournaments"
urlpatterns = router.urls

在Swagger中,我最终看到了2种请求类型:

http://localhost:8000/api/tournaments/tournament_types/{id}
http://localhost:8000/api/tournaments/tournament_types/

第一个(带ID)按预期返回对象。但是第二个,它应该返回一个列表,返回一个404响应。

我已经尝试通过将此添加到视图来指定请求类型:

def list(self, request):
queryset = TournamentType.objects.all()
serializer = serializers.TournamentTypeSerializer(queryset, many=True)
return Response(serializer.data)

但结果还是一样。

我错过了什么?我已经检查了所有的文档,一切似乎都已就绪。

<标题>

更新我已经设法使一个方法,返回对象的列表,但端点看起来很奇怪,这绝对是一个拐杖,而不是一个适当的解决方案:

# Views.py
class TournamentTypeViewSet(ReadOnlyModelViewSet):
queryset = TournamentType.objects.all()
serializer_class = serializers.TournamentTypeSerializer
@swagger_auto_schema(method="get")
@action(detail=True, methods=["get"])
def tt(self, request, *args, **kwargs):
queryset = TournamentType.objects.all()
serializer = serializers.TournamentTypeSerializer(queryset, many=True)
return Response(serializer.data)

/api/tournaments/tournament-types/{id}/tt/它返回列表,但它需要一些输入才能工作,它可以是任何东西,它似乎没有检查id参数。

如果我向/api/tournaments/tournament-types/tt/发送请求,它返回相同的404响应,而不是错误。

你的代码是正确的,它为我工作。

我认为你在主项目文件夹的urls.py中做错了什么或者你在settings.py

中改变了什么重新启动IDE并再次尝试运行。确保检查主项目文件夹的urls.py

我已经找到解决它的方法了。问题出在路线上。以前我的tournaments/urls.py看起来像这样:

router = DefaultRouter()
router.register("tournament-types", TournamentTypeViewSet)
app_name = "tournaments"
urlpatterns = router.urls

然后传递给主router.py。但是当我把它直接放到主文件中时,它开始工作了:

router = DefaultRouter()
router.register("tournament-types", TournamentTypeViewSet)
app_name = "app_name"
urlpatterns = [path("tournaments/", include('core.tournament.urls'))]
urlpatterns += router.urls

不知道为什么第一个版本不能工作。

最新更新