Django Rest Framework ModelSerializer 外键如何插入数据?

一个简单的多对多表,实现版本+版本文件的逻辑。
单层的ModelSerializer 写起来非常容易,直接传入序列器然后save就行了。但是带外键的字段是需要怎么处理呢?

如果把创建版本和提交文件,分成2个接口,处理应该会方便些。但是效率不高。我想一次post就全解决、

import json
import requests

url = 'http://127.0.0.1:8000/api/version'

file_data = [{"filename": "asd", "md5": "asdasd"}, {"filename": "asd2", "md5": "asdasd2"}]
fff = json.dumps(file_data)

params = {
    "version_str": "0.0.0.1",
    "files": fff,
}

req = requests.post(url, data=params)
print(req.json())

view

    def post(self, request):
        serial = api.serializer.VersionSerializer(data=request.data)
        if serial.is_valid():
            serial.save()
            return Response("ok", status=status.HTTP_201_CREATED)
        else:
            return Response(serial.error_messages, status=status.HTTP_400_BAD_REQUEST)

model

class FileModel(models.Model):
    filename = models.CharField(max_length=255, verbose_name='路径和文件名')
    md5 = models.CharField(max_length=255, verbose_name='MD5')


class VersionModel(models.Model):
    version_str = models.CharField('版本', max_length=8, help_text='string 版本号')

    files = models.ManyToManyField(FileModel, related_name="file_list")

serializer


class VersionSerializer(ModelSerializer):
    file_list = FileSerializer(many=True)

    class Meta:
        model = api.models.VersionModel
        fields = ('version_str', 'files')

    def create(self, validated_data):
        return api.models.VersionModel.objects.create(**validated_data)
阅读 10.5k
2 个回答
class VersionSerializer(ModelSerializer):
    # 用files域来检查
    files = FileSerializer(many=True)

    class Meta:
        model = api.models.VersionModel
        fields = ('version_str', 'files')

    # 这里如果要保持如此简洁,需要额外实现VersionModel的manager,
    # manager的create函数需要实现:
    # 1. file_objs = FileSerializer(data=validate_data['files'], many=True)
    # 2. ver_obj = VersionModel(validate_data['version_str'].save()
    # 3. 遍历file_objs: ver_obj.files.add(file_obj.id)
    def create(self, validated_data):
        return api.models.VersionModel.objects.create(**validated_data)

DRF本身很灵活,应该还有其他方法。

额..你不是已经加入了吗.
file_list = FileSerializer(many=True)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题