返回在Django Rest Framework中使用ModelSerializer和ModelViewSet通过POST创建的新商品的ID

如何解决返回在Django Rest Framework中使用ModelSerializer和ModelViewSet通过POST创建的新商品的ID

在Django Rest Framework中创建id后,我想获得新的Post作为响应。

预期功能用户会收到一个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

解决方法

感谢这篇文章:Get the id of the object recently created Django Rest Framework我设法提出了一个潜在的解决方案。这似乎可行,但我不确定这是否是“最佳”方法。

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,**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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?