gpt4 book ai didi

python - DRF 上传多个文件

转载 作者:行者123 更新时间:2023-11-28 19:10:27 30 4
gpt4 key购买 nike

我正在使用 DRF 创建具有多个附件的用户。创建用户时,您必须上传一个或多个文件。当我对您加载新文件(没有其他修改字段)的用户进行更新时,响应返回旧实例。

我通过在返回实例之前强制序列化程序中的“_prefetched_objects_cache”属性来解决。

setattr(instance, '_prefetched_objects_cache', True)

是否正确?你有其他解决方案吗?谢谢

这是我的代码

在模型.py中

class User(models.Model):
#field of user model

class Attachment(models.Model):
class Meta:
db_table = 'attachment'

path = models.FileField()
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='attachments')
dt_created = models.DateTimeField(auto_now_add=True, verbose_name='Created')

在serializer.py中

class AttachmentSerializer(serializers.ModelSerializer):
class Meta:
model = Attachment
fields = '__all__'

class UserSerializer(serializers.ModelSerializer):
attachments = AttachmentSerializer(many=True, read_only=True)


def create(self, validated_data):

user = User.objects.create(**validated_data)

for file_item in self.initial_data.getlist('attachments'):
c = Attachment(path=file_item, user=user)
c.save()
return user

def update(self, instance, validated_data):
for item in validated_data:
if User._meta.get_field(item):
setattr(instance, item, validated_data[item])

c = Attachment(path=self.context['request'].FILES['attachments'], user=instance)
c.save()

instance.save()
setattr(instance, '_prefetched_objects_cache', True)
return instance

在测试.py中

io = StringIO.StringIO()
io.write('foo')
file = InMemoryUploadedFile(io, None, 'foo.txt', 'text', io.len, None)
file.seek(0)
self.user['attachments'] = [file, file]
data = self.user
response = self.client.post(url, data, format='multipart')
file = InMemoryUploadedFile(io, None, 'foo2.txt', 'text', io.len, None)
file.seek(0)
#url = url of user detail for update
local_user['attachments'].extend(response.data['attachments'])
local_user['attachments'].append(file)
data = local_user
response = self.client.put(path=url, data=data, format='multipart')

最佳答案

如果您使用表单发布到 DRF,则可以使用 FormParserMultiPartParser 如果您使用表单发布数据

例如

...
from rest_framework.parsers import MultiPartParser, FormParser
...

class UserView(APIView):
parser_classes = (FormParser, MultiPartParser)

def post(self, request):
...

文件将作为 InMemoryUploadedFile 实例在 request.datarequest.FILES 下可用。您可以继续使用序列化程序或更适合您查看逻辑的任何内容。

不要忘记在表单中将 enctype 设置为 multipart/form-data,否则文件将无法正确解析。

<form action="..." method="POST" enctype="multipart/form-data">
<input type="file" name="file-1" />
<input type="file" name="file-2" />
</form>

关于python - DRF 上传多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41141084/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com