Sam*_*day 2 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')
Run Code Online (Sandbox Code Playgroud)
以下是观点:
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
Run Code Online (Sandbox Code Playgroud)
而且,对于它的价值,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)
Run Code Online (Sandbox Code Playgroud)
总的来说,这与教程中的几乎完全相同.加载"路由","汽车"和"位置"URL工作正常,但"用户"URL会引发错误"无法使用视图名称'routes-detail'解析超链接关系的URL".
在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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7693 次 |
| 最近记录: |