Django FileField将空文件保存到数据库

6ioyuze2  于 2022-12-27  发布在  Go
关注(0)|答案(1)|浏览(154)

我有一个视图,它应该生成一个临时JSON文件并将此TempFile保存到数据库。此文件的内容是一个名为assets的字典,它是使用DRF使用序列化程序创建的。此文件应该写入名为CollectionSnapshot的模型中的数据库。

class CollectionSnapshotCreate(generics.CreateAPIView):
    permission_classes = [MemberPermission, ]

    def create(self, request, *args, **kwargs):
        collection = get_collection(request.data['collection_id'])
        items = Item.objects.filter(collection=collection)

        assets = {
            "collection": CollectionSerializer(collection, many=False).data,
            "items": ItemSerializer(items, many=True).data,
        }

        fp = tempfile.TemporaryFile(mode="w+")
        json.dump(assets, fp)
        fp.flush()

        CollectionSnapshot.objects.create(
            final=False,
            created_by=request.user,
            collection_id=collection.id,
            file=ContentFile(fp.read(), name="assets.json")
        )
        fp.close()

        return JsonResponse({}, status=200)

打印资源正确返回字典。所以我正常获取字典。
按照下面的解决方案,我确实得到了保存到数据库的文件,但没有任何内容:copy file from one model to another
json.dump(assets,fp)似乎在静默中失败,或者我缺少一些东西,无法在将内容发送到数据库之前将其实际保存到临时文件中。
问题是:为什么数据库中的文件是空的?

rta7y2nd

rta7y2nd1#

我发现fp.read()会根据文件中的当前指针抛出内容。至少,这是我的理解。因此,在我将资产dict作为json转储到temp文件后,我必须使用www.example.com(0)将光标带回起点fp.seek。这样,当我fp.read在file=ContentFile(fp.read()内调用www.example.com()时,...)它实际上读取了所有的内容。它给我的是空的,因为光标在文件的末尾,所以没有什么可读的。

fp = tempfile.TemporaryFile(mode="w+")
    json.dump(assets, fp)
    fp.flush()
    fp.seek(0) // important

    CollectionSnapshot.objects.create // stays the same

相关问题