Django REST框架:无法使用视图名称解析超链接关系的URL

Sam*_*day 2 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')
Run Code Online (Sandbox Code Playgroud)

以下是观点:

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
Run Code Online (Sandbox Code Playgroud)

而且,对于它的价值,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)
Run Code Online (Sandbox Code Playgroud)

总的来说,这与教程中的几乎完全相同.加载"路由","汽车"和"位置"URL工作正常,但"用户"URL会引发错误"无法使用视图名称'routes-detail'解析超链接关系的URL".

Kev*_*own 8

view_name通常应该是[route]-detail路由器,这里[route]是您注册的模型的名称ViewSet下.

在你的情况下,view_name应该是position-detail,而不仅仅是position.您还使用routes-detail替代的drivingroutes-detail,它是使用长文件名,因为你的模型是DrivingRouteRoute.您可以在路由器上base_name使用时通过设置(第三个参数)来覆盖它register.

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)
Run Code Online (Sandbox Code Playgroud)