Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django Rest框架中使用ModelSerializer和ModelViewSet通过POST创建的新项的返回id_Python_Django_Django Rest Framework_Django Rest Viewsets - Fatal编程技术网

Python 在Django Rest框架中使用ModelSerializer和ModelViewSet通过POST创建的新项的返回id

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

在Django Rest框架中进行
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