我有两个型号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框架,我正在尝试使其尽可能整洁。