能否跨urls.py文件使用slug?遇FieldError错误求排查
问题排查:跨urls.py传递slug引发FieldError错误
报错信息
FieldError at /new-api/tournaments/fifa-world-cup/teams/
Unsupported lookup 'custom_url' for ForeignKey or join on the field not permitted.
问题背景
我尝试从另一个urls.py文件中获取slug字段,想知道报错原因是否是无法跨urls.py使用slug,或是其他问题。项目的路由和视图代码如下:
项目代码
tournament模块 urls.py
urlpatterns = [ path("", views.getNewTournaments, name="tournaments"), path("<slug:custom_url>/", views.getNewTournament, name="tournament"), path("create/", views.postNewTournament, name="post-tournament"), path("<slug:custom_url>/teams/", include("teams.urls"), name="tournament-teams"), ]
teams模块 urls.py
urlpatterns = [ path("", views.teams.as_view(), name="teams"), ]
tournament模块 views.py
@api_view(["GET"]) def getNewTournaments(request): tournaments = NewTournament.objects.all() serializer = NewTournamentSerializer(tournaments, many=True) return Response(serializer.data)
teams模块 views.py
class teams(APIView): def get(self, request, custom_url): teams = Team.objects.filter(tournament__custom_url=custom_url) serializer = TeamSerializer(teams, many=True) return Response(serializer.data)
错误原因与解决方案
这个错误和跨urls.py使用slug完全无关,问题出在ORM查询逻辑上:
- 你的
Team模型里的tournament外键关联的NewTournament模型,不存在名为custom_url的数据库字段,或者该字段是通过@property定义的非数据库属性(无法用于ORM跨表查询)。 - 路由部分的配置是正确的,
custom_url已经成功传递给了teams视图的get方法,跨urls.py传递参数是完全可行的。
解决步骤:
- 检查
NewTournament模型,确认是否存在custom_url字段,且是数据库字段(比如SlugField类型)。 - 如果
NewTournament中存储slug的字段名不是custom_url(比如叫slug),把查询语句修改为:Team.objects.filter(tournament__slug=custom_url)。 - 确认
Team模型的tournament外键确实关联的是NewTournament模型,没有关联错误。
内容的提问来源于stack exchange,提问作者Martin Arreola
相关产品推荐
相关产品推荐

