首页 > 解决方案 > 在单个序列化程序 django 中读取和创建嵌套关系

问题描述

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

我正在使用 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 框架,我正在努力使其尽可能整洁。

标签: pythondjango

解决方案


推荐阅读