python - Django REST 框架 : Could not resolve URL for hyperlinked relationship using view name

标签 python django rest django-rest-framework

我对这个相当普遍的问题进行了广泛研究,但没有一个修复方法对我有用。我正在 REST 框架中构建一个 Django 项目,并希望使用超链接关系。用户可以拥有许多独立的汽车和路线。路线是位置的集合。

这些是我的序列化器:

class CarSerializer(serializers.HyperlinkedModelSerializer):
    user = serializers.Field(source='user.username')
    class Meta:
        model = Car
        fields = ('url', 'make', 'year', 'car_model', 'user')

class PositionSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Position
        fields = ('url', 'drive_route', 'timestamp', 'latitude', 'longitude', 'altitude','speed','heading', 'accuracy', 'altitude_accuracy')

class DrivingRouteSerializer(serializers.HyperlinkedModelSerializer):
    position = serializers.HyperlinkedRelatedField(view_name='position', many=True)
    user = serializers.Field(source='user.username')
    class Meta:
        model = DrivingRoute
        fields = ('url', 'id', 'route', 'position', 'user')

class UserSerializer(serializers.HyperlinkedModelSerializer):
    routes = serializers.HyperlinkedRelatedField(view_name='routes-detail', many=True)
    car = serializers.HyperlinkedRelatedField(view_name='car-detail', many=True)
    class Meta:
        model = User
        fields = ('url', 'username', 'routes', 'car')

以下是观点:

class CarViewSet(viewsets.ModelViewSet):
    queryset = Car.objects.all()
    serializer_class = CarSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    def pre_save(self, obj):
        obj.user = self.request.user

class DrivingRouteViewSet(viewsets.ModelViewSet):
    queryset = DrivingRoute.objects.all()
    serializer_class = DrivingRouteSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    def pre_save(self, obj):
        obj.user = self.request.user

class PositionViewSet(viewsets.ModelViewSet):
    queryset = Position.objects.all()
    serializer_class = PositionSerializer

class UserViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

而且,就其值(value)而言,URL。我正在使用默认路由器,就像在 Django REST Framwork 教程中一样。

router = DefaultRouter()
router.register(r'car', views.CarViewSet)
router.register(r'routes', views.DrivingRouteViewSet)
router.register(r'position', views.PositionViewSet)
router.register(r'users', views.UserViewSet)

总体而言,这与教程中的内容几乎完全相同。加载“路线”、“汽车”和“位置”URLS 工作正常,但“用户”URL 会抛出错误“无法使用 View 名称‘routes-detail’解析超链接关系的 URL。”

最佳答案

对于路由器,view_name 通常应该是 [route]-detail,其中 [route] 是您注册的模型的名称ViewSet下。

在您的情况下,view_name 应该是position-detail,而不仅仅是position。您还使用了 routes-detail 而不是 drivingroutes-detail,后者使用的是长名称,因为您的模型是 DrivingRoute 而不是 路线。在路由器上使用 register 时,您可以通过设置 base_name(第三个参数)来覆盖它。

router = DefaultRouter()
router.register(r'car', views.CarViewSet)
router.register(r'routes', views.DrivingRouteViewSet, "routes")
router.register(r'position', views.PositionViewSet)
router.register(r'users', views.UserViewSet)

关于python - Django REST 框架 : Could not resolve URL for hyperlinked relationship using view name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26986014/

相关文章:

python - Django "Models aren' t 已加载”

css - 使用 Boolean 的 hacked 内联复选框将 CSS 类添加到 django-crispy 表单

java - Restful Web 服务 Maven 项目 netbeans

python - 跨多个用户的 RESTful API

浏览器顶部的 python 屏幕截图

Python 2.7 - 重定向处理程序不在重定向时传递参数

python - 基本的 socket.io 应用程序不工作

python - Python 中 unicode() 和 encode() 函数的使用

python - Django:如何在 settings.py 中退出

xml - 职位列表规范和/或查询标准?