在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Python/ Django Rest Framework ModelSerializer 外鍵

Django Rest Framework ModelSerializer 外鍵如何插入數(shù)據(jù)?

一個(gè)簡(jiǎn)單的多對(duì)多表,實(shí)現(xiàn)版本+版本文件的邏輯。
單層的ModelSerializer 寫起來(lái)非常容易,直接傳入序列器然后save就行了。但是帶外鍵的字段是需要怎么處理呢?

如果把創(chuàng)建版本和提交文件,分成2個(gè)接口,處理應(yīng)該會(huì)方便些。但是效率不高。我想一次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 版本號(hào)')

    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)
回答
編輯回答
慢半拍

額..你不是已經(jīng)加入了嗎.
file_list = FileSerializer(many=True)

2017年4月17日 13:20
編輯回答
假灑脫
class VersionSerializer(ModelSerializer):
    # 用files域來(lái)檢查
    files = FileSerializer(many=True)

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

    # 這里如果要保持如此簡(jiǎn)潔,需要額外實(shí)現(xiàn)VersionModel的manager,
    # manager的create函數(shù)需要實(shí)現(xiàn):
    # 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本身很靈活,應(yīng)該還有其他方法。

2018年9月9日 04:47