DRF外部主键,使用嵌套序列化程序自动递增以进行级联插入

时间:2018-03-23 07:51:02

标签: python django rest django-rest-framework

我想在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"
  }
}

2 个答案:

答案 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>