使用Django Rest Framework为POST有效负载中的外键指定备用值';s通用视图集
我需要能够在POST请求的有效负载中指定非外部关系对象的pk/id 我的模型:使用Django Rest Framework为POST有效负载中的外键指定备用值';s通用视图集,django,django-rest-framework,Django,Django Rest Framework,我需要能够在POST请求的有效负载中指定非外部关系对象的pk/id 我的模型: class Damage(PDAbstractBaseModel): vehicle = models.ForeignKey(Vehicle, related_name='damages', on_delete=models.CASCADE) driver = models.ForeignKey(Driver, related_name=
class Damage(PDAbstractBaseModel):
vehicle = models.ForeignKey(Vehicle, related_name='damages',
on_delete=models.CASCADE)
driver = models.ForeignKey(Driver, related_name='damages',
null=True, on_delete=models.CASCADE)
description = models.TextField()
我的看法是:
class VehicleDamageViewSet(mixins.ListModelMixin,
mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
viewsets.GenericViewSet):
permission_classes = (permissions.IsAuthenticated, IsDriverOrAbove)
serializer_class = DamageSerializer
queryset = Damage.objects.all()
lookup_field = 'uid'
lookup_url_kwarg = 'uid'
lookup_value_regex = '[0-9a-f-]{36}'
ordering_fields = ['modified', ]
ordering = ['modified']
logger = get_logger('VehicleDamageViewSet')
def get_serializer_context(self):
return {'request': self.request}
def get_vehicle(self, vehicle_uid):
return Vehicle.objects.get(uid=vehicle_uid)
def get_queryset(self):
return self.queryset.filter(vehicle__uid=self.kwargs['vehicle_uid'])
def perform_create(self, serializer):
return serializer.save(vehicle=self.get_vehicle(self.kwargs['vehicle_uid']))
我的URL.py
... omitted for brevity ...
router = routers.SimpleRouter()
router.register(r'damage/(?P<vehicle_uid>[a-fA-F0-9-]+)', VehicleDamageViewSet)
... omitted for brevity ....
单元测试失败的部分:
data = {
# 'driver': self.user.id,
'driver': self.user.uid,
'description': 'horn does not work.',
}
url = reverse("vehicle:damage-list", kwargs={'vehicle_uid': vehicle_uid})
# print(f"damage POST {url}\npayload {data}")
response = self.client.post(path=url, data=data, format="json")
print(response.status_code)
print(response.data['driver'][0])
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
如果我指定'driver':self.user.id,
,但如果我指定'driver':self.user.uid,
我得到这个输出:
400
Incorrect type. Expected pk value, received str.
我需要更改什么才能使用self.user.uid
而不是self.user.id
如果您能帮忙,我们将不胜感激
400
Incorrect type. Expected pk value, received str.