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

时间:2014-11-18 03:18:54

标签: 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

而且,对于它的价值,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)

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

2 个答案:

答案 0 :(得分:8)

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

在您的情况下,view_name应为position-detail,而不仅仅是position。您还使用routes-detail代替drivingroutes-detailDrivingRoute使用长名称,因为您的模型是Route而不是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) (第三个参数)来覆盖此设置。

{{1}}

答案 1 :(得分:1)

您有以下观点:

  • 轿厢列表
  • 轿厢细节
  • drivingroute列表
  • drivingroute细节
  • 位置列表
  • 位置细节
  • 用户列表
  • 用户细节

如果我们采取以下路线:

router.register(r'car', views.CarViewSet)

这意味着可以在http://yourapi.com/car/下为car-list访问,在http://yourapi.com/car/1/下可以访问car-detail(其中1是id)。

视图名称是从类名减去后缀ViewSet以及列表或详细信息构建的。

根据这些规则更改您的代码,请重试。

干杯!