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

发布于 2022-09-06 15:00:05 字数 1609 浏览 10 评论 0

一个简单的多对多表,实现版本+版本文件的逻辑。
单层的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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

乞讨 2022-09-13 15:00:05
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本身很灵活,应该还有其他方法。

凯凯我们等你回来 2022-09-13 15:00:05

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文