Django REST框架:无法使用视图名称解析超链接关系的URL [英] Django REST Framework: Could not resolve URL for hyperlinked relationship using view name

查看:897
本文介绍了Django REST框架:无法使用视图名称解析超链接关系的URL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I've extensively researched this fairly common issue, but none of the fixes worked for me. I'm building a Django project in REST framework and want to use hyperlinked relations. The User can have many Cars and Routes, which are independent. A Route is a collection of Positions.

这些是我的序列化程序:

These are my serializers:

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')

这里是这些视图: / p>

And here are the views:

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教程一样。

And, for what it's worth, the URLs. I am using the Default Router, just as in the Django REST Framwork tutorial.

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)

总的来说,这几乎完全一样如教程中所述。加载'routes','car'和'position'URLS可以正常工作,但是用户的URL会引发错误无法使用视图名称routes-detail'解析超链接关系的URL。

Overall, this is almost exactly the same as in the tutorial. Loading the 'routes', 'car', and 'position' URLS works fine, but the 'users' URL throws the error "Could not resolve URL for hyperlinked relationship using view name 'routes-detail'."

推荐答案

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

The view_name should typically be [route]-detail for routers, where [route] is the name of the model you registered the ViewSet under.

在你的情况下, view_name 应该是 ,而不仅仅是位置。您还使用 routes-detail 而不是 drivingroutes-detail ,这是使用长名称,因为您的模型是 DrivingRoute 而不是路由。在路由器上使用注册时,可以通过设置 base_name (第三个参数)来覆盖此选项。

In your case, the view_name should be position-detail, not just position. You are also using routes-detail instead of drivingroutes-detail, which is using the long name because your model is DrivingRoute and not Route. You can override this by setting a base_name (third parameter) when using register on the router.

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)

这篇关于Django REST框架:无法使用视图名称解析超链接关系的URL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆