Return 使用 Django Rest Framework 中的 ModelSerializer 和 ModelViewSet 创建的新项目的 ID POST
Return id of new Item created with POST using ModelSerializer and ModelViewSet in Django Rest Framework
在 Django Rest Framework 中创建 Post
后,我希望得到新的 id
作为响应。
预期功能: 用户收到 json 响应,其中包含指向创建的新项目的超链接。
POST
{
"label": "BMW M3",
"price": 5000.00
}
回复:
{
"id-url": "www.website.com/api/products/id/"
}
我知道这个主题已经以多种方式讨论过,但我正在寻找一个使用 ModelSerializer 的最小(但完整)示例,我还没有找到这个,所以我的问题。
我的模型:
class Product(models.Model):
label = models.CharField(max_length=50, blank=True, null=True)
price = models.FloatField(blank=True, null=True)
我的序列化器:
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__'
我的看法:
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
我的网址:
router = routers.DefaultRouter()
router.register('products', ProductViewSet)
urlpatterns = [
path('', include(router.urls)),
]
尝试次数:
一些我尝试过的参考资料。
这是类似的问题,但答案似乎不完整 ex_0
我可以重新创建此 ex_1,但不会给我 ID
多亏了这个 post: 我设法想出了一个可能的解决方案。它似乎有效,但我有点不确定它是否是“最佳”方法。
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
def create(self, request):
serializer = ProductSerializer(data=request.data)
if serializer.is_valid():
product = serializer.save()
pid = product.id
product.url = f'http://localhost:8000/api/products/{pid}/'
data = serializer.data
data.update({'id-url':product.url}) # attaching key-value to the dictionary
return Response(data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
def create(self, request, *args, **kwargs):
response = super(ProductViewSet, self).create(request, *args, **kwargs)
# response.data has everything specified in your serializer; it seems fine to clobber it
# alternatively, you could add to it: response.data['foo']='baz'
response.data = {'id-url': f'http://localhost:8000/api/products/{response.data['id']}/'}
return response
在 Django Rest Framework 中创建 Post
后,我希望得到新的 id
作为响应。
预期功能: 用户收到 json 响应,其中包含指向创建的新项目的超链接。
POST
{
"label": "BMW M3",
"price": 5000.00
}
回复:
{
"id-url": "www.website.com/api/products/id/"
}
我知道这个主题已经以多种方式讨论过,但我正在寻找一个使用 ModelSerializer 的最小(但完整)示例,我还没有找到这个,所以我的问题。
我的模型:
class Product(models.Model):
label = models.CharField(max_length=50, blank=True, null=True)
price = models.FloatField(blank=True, null=True)
我的序列化器:
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__'
我的看法:
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
我的网址:
router = routers.DefaultRouter()
router.register('products', ProductViewSet)
urlpatterns = [
path('', include(router.urls)),
]
尝试次数:
一些我尝试过的参考资料。 这是类似的问题,但答案似乎不完整 ex_0 我可以重新创建此 ex_1,但不会给我 ID
多亏了这个 post:
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
def create(self, request):
serializer = ProductSerializer(data=request.data)
if serializer.is_valid():
product = serializer.save()
pid = product.id
product.url = f'http://localhost:8000/api/products/{pid}/'
data = serializer.data
data.update({'id-url':product.url}) # attaching key-value to the dictionary
return Response(data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
def create(self, request, *args, **kwargs):
response = super(ProductViewSet, self).create(request, *args, **kwargs)
# response.data has everything specified in your serializer; it seems fine to clobber it
# alternatively, you could add to it: response.data['foo']='baz'
response.data = {'id-url': f'http://localhost:8000/api/products/{response.data['id']}/'}
return response