我对这个相当普遍的问题进行了广泛研究,但没有一个修复方法对我有用。我正在 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/