Django REST框架:无法使用视图名称解析超链接关系的URL [英] Django REST Framework: Could not resolve URL for hyperlinked relationship using view name
问题描述
我已经广泛研究了这个相当普遍的问题,但是没有一个修复对我有用。我正在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屋!