我有两个模型,一个是父模型,另一个是模型
class Parent(models.Model):
#fields
class ParentItems(models.Model):
parentId = #parentId
#fields
,并要创建方法 POST parent/
,其中包含ParentItems,例如
{
"parentField": "value",
"parentItems": [
{
"parentItemsField": "value"
}
]
}
因此,我先使用Parent
创建ModelViewSet
视图,然后使用序列化程序:
class ParentItemSerializer(serializers.ModelSerializer):
#serializer
class ParentSerializer(serializers.ModelSerializer):
parentItems = ParentItemSerializer(many=True, required=True, write_only=True)
def _createParentItems(self, parentItem, parent):
for item in parentItem:
item['parent'] = parent.id
parentItemSerializer = ParentItemSerializer(data=item)
if parentItemSerializer.is_valid(raise_exception=True):
itemSerializer.save()
def create(self, validated_data):
with transaction.atomic():
parentItems = validated_data.pop('parentItems')
createdData = super(ParentSerializer, self).create(validated_data)
# create the parent item
self._createParentItems(parentItems, createdData)
return createdData
我在parentItems
方法内的ParentSerializer
中添加create
字段,弹出parentItems
并将其传递到_createParentItems
中以创建项目。
但是这不起作用,parentItems已经是一个对象。当我致电parentItemSerializer.is_valid(raise_exception=True)
时出错。
如何在django rest中从另一个序列化器保存对象? 我应该使用另一个序列化器字段吗?
使用OrderedDict尝试过,它不起作用,也没有将项目传递给validated_data
答案 0 :(得分:0)
首先像下面的代码一样更改模型。然后,您可以使用我为您编写的序列化程序。
class Parent(models.Model):
#fields
class ParentItem(models.Model):
parent = models.ForeignKey(Parent, on_delete=models.CASCADE)
# other fields
class ParentItemSerializer(ModelSerializer):
class Meta:
model = ParentItem
fields = ('field1', ...)
def create(self, validated_data):
ParentItem.objects.create(field1=validated_data['field2'],...)
return validated_data
class Parent(ModelSerializer):
parentItems = ParentIremSerializer(many=True)
class Meta:
model=Parent
fields = ('parentItems', 'other fields',...)
def create(self, validated_data):
parent = Parent('field1'=validated_data['field1'])
parent.save()
parentItemsList = validate_data.pop('parentItems')
parentItemSer = ParentItemSerialzer(data=parentItemsList,many=True)
if parentItemSer.is_valid():
parentItemSer.save()
return validated_data