我已经广泛研究了这个相当常见的问题,但没有一个修复工作对我有用。我正在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”。
答案 0 :(得分:8)
路由器的view_name
通常应为[route]-detail
,其中[route]
是您在ViewSet
下注册的模型的名称。
在您的情况下,view_name
应为position-detail
,而不仅仅是position
。您还使用routes-detail
代替drivingroutes-detail
,DrivingRoute
使用长名称,因为您的模型是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)
您有以下观点:
如果我们采取以下路线:
router.register(r'car', views.CarViewSet)
这意味着可以在http://yourapi.com/car/下为car-list访问,在http://yourapi.com/car/1/下可以访问car-detail(其中1是id)。
视图名称是从类名减去后缀ViewSet以及列表或详细信息构建的。
根据这些规则更改您的代码,请重试。
干杯!