我有一个视图,它应该生成一个临时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)似乎在静默中失败,或者我缺少一些东西,无法在将内容发送到数据库之前将其实际保存到临时文件中。
问题是:为什么数据库中的文件是空的?
1条答案
按热度按时间rta7y2nd1#
我发现fp.read()会根据文件中的当前指针抛出内容。至少,这是我的理解。因此,在我将资产dict作为json转储到temp文件后,我必须使用www.example.com(0)将光标带回起点fp.seek。这样,当我fp.read在file=ContentFile(fp.read()内调用www.example.com()时,...)它实际上读取了所有的内容。它给我的是空的,因为光标在文件的末尾,所以没有什么可读的。