我想在Message模型中插入一个具有子类的Conversation模型 我还希望它使用单个Viewset方法进行保存 Message具有Conversation主键的外键。
我正在寻找类似于java + spring类实现的东西,其中Parent引用了Child类 父和子具有auto_increment注释。调用Spring JPA save并插入插入。
父类:
int id;
Child reference;
儿童班:
int child_id;
int parent_id;
服务方式:
parent.setReference(child);
jpa.save(parent); // both parent and child is inserted
Django Rest Framework有这样的东西吗?还是Django Framework?
JSON:
{
"model": "conversation",
"id": auto_increment,
"title": "chat",
"message": {
"model": "message",
"conversation_id": value from id in conversation model,
"message": "hi"
}
}
答案 0 :(得分:0)
为什么你需要拥有" id"在json。
从DRF序列化程序中删除它,django ORM将自动增加每个新记录的id。默认情况下,模型的id字段会自动递增。
答案 1 :(得分:0)
您要找的是writable nested serializers。此外,所有django模型默认都有自动增量主键,或者您可以添加自己的自动增量字段。
默认情况下,嵌套序列化程序是只读的。如果要支持对嵌套序列化程序字段的写操作,则需要创建create()和/或update()方法,以便明确指定应如何保存子关系。
以下是使用“专辑和曲目”的可写嵌套序列化程序的示例。
class TrackSerializer(serializers.ModelSerializer):
class Meta:
model = Track
fields = ('id', 'order', 'title', 'duration', 'album_id')
class AlbumSerializer(serializers.ModelSerializer):
tracks = TrackSerializer(many=True)
class Meta:
model = Album
fields = ('id', 'album_name', 'artist', 'tracks')
def create(self, validated_data):
tracks_data = validated_data.pop('tracks')
album = Album.objects.create(**validated_data)
for track_data in tracks_data:
Track.objects.create(album=album, **track_data)
return album
>>> data = {
'id': 1,
'album_name': 'The Grey Album',
'artist': 'Danger Mouse',
'tracks': [
{'id': 1, 'order': 1, 'title': 'Public Service Announcement', 'duration': 245, 'album_id': 1},
{'id': 2, 'order': 2, 'title': 'What More Can I Say', 'duration': 264, 'album_id': 1},
{'id': 3, 'order': 3, 'title': 'Encore', 'duration': 159, 'album_id': 1},
],
}
>>> serializer = AlbumSerializer(data=data)
>>> serializer.is_valid()
True
>>> serializer.save()
<Album: Album object>