Python 在Django Rest框架中使用ModelSerializer和ModelViewSet通过POST创建的新项的返回id
在Django Rest框架中进行Python 在Django Rest框架中使用ModelSerializer和ModelViewSet通过POST创建的新项的返回id,python,django,django-rest-framework,django-rest-viewsets,Python,Django,Django Rest Framework,Django Rest Viewsets,在Django Rest框架中进行Post之后,我希望得到新的id作为响应 预期功能:用户获得一个json响应,其中包含指向新创建项的超链接 职位 答复: { "id-url": "www.website.com/api/products/id/" } 我知道这个主题已经以各种方式讨论过了,但我正在寻找一个使用ModelSerializer的最小(但完整)示例,我还没有找到这个,因此我的问题是 我的模型: class Produ
Post
之后,我希望得到新的id
作为响应
预期功能:用户获得一个json响应,其中包含指向新创建项的超链接
职位
答复:
{
"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)),
]
尝试:
我尝试过一些参考资料。
这里有一个类似的问题,但答案似乎并不完整
我可以重新创建它,但由于这篇文章,我没有给我id:我设法想出了一个可能的解决方案。这似乎有效,但我有点不确定这是否是“最好”的方式
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)
你现在有什么?它看起来像你的模型吗?这可能会帮助你,谢谢,超链接在这里是次要的,但最重要的是我要寻找的id(我将创建超链接),我修改了问题以反映这一点。你为什么说看起来不完整?尝试时会发生什么情况?您好,向序列化程序添加“id=serializers.IntegerField(source='pk')”不会创建id为的json响应。尝试时,我还收到一个错误,“需要一个有效的整数”。理想情况下,我正在寻找一个完整的(功能性)答案。作为一个新手,不完整的代码片段有点令人困惑,因为在解释中遗漏了很多内容。
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