在单个序列化器Django中读取和创建嵌套关系

时间:2019-07-10 15:36:16

标签: python django

我有两个型号Category和Products,以及它们之间的经典一对多关系。每个产品都属于一个类别。

我正在使用Django-Rest-Framework。

我使用ModelViewSet作为ViewSet,使用ModelSerializer作为序列化器。

我创建了具有完整CRUD操作的ProductViewSet。

我要实现的目的是将关系包括在READ操作(list,retrieve)中。响应应该像这样。

{
  "id" : 2,
  "name" : "foo product" , 
   "category" : {
     "id" : 4, 
     "name" : "foo relation" 
  }
}

所以我将Meta中的深度字段设置为1。

class ProductSerializer(ModelSerializer):

    class Meta:
        model = Product
        exclude = ('createdAt',)
        depth = 1

是什么使类别只读的,但是我希望它在其他操作(POST,PUT)中可写。

我知道我可以使用两个序列化来解决问题,但这是一个重复性的问题,我不想为我拥有的每个模型编写两个序列化。

我试图在序列化器中添加category_id字段,但是我必须重写create方法以使其正常工作。 再一次,我尝试编写更少的代码。因为我最终将覆盖所有应用程序序列化程序。

class ProductSerializer(ModelSerializer):

    category_id = PrimaryKeyRelatedField(queryset=Category.objects.all())

    class Meta:
        model = Product
        exclude = ('createdAt',)
        depth = 1

    def create(self, validated_data):
        category_id = validated_data.pop('category_id').id
        validated_data['category_id'] = category_id
        return super().create(validated_data)

这是我的第一个Django框架,我正在尝试使其尽可能整洁。

0 个答案:

没有答案