django - 将 url 保存到 Django Rest Framework 中的图像字段
问题描述
目的
我想让 POST 参数
image
可以填充url
file
base64
但保存为图像。
代码
模型.py
class Item(models.Model):
image = models.ImageField(upload_to='item')
...
视图.py
class ItemViewSet(viewsets.ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemSerializer
def create(self, request):
if request.data.get('type') == 'url':
request.POST._mutable = True
request.data['image'] = convert_from_url(request.data['image'])
serializer = ItemSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
当输入类型为 url 时,我修改请求数据。
convert_from_url是一种将图像保存到TemporaryFile
并打包的方法InMemoryUploadedFile
序列化程序.py
class ItemSerializer(serializers.ModelSerializer):
def create(self, validated_data):
item = Item.objects.create(
image=validated_data['image']
)
...
item.save()
return item
问题
serializer = ItemSerializer(data=request.data)
此行没有传递正确的 request.data(它不包含数据)
validated_data
(序列化程序)我之前修改它时没有得到图像
解决方案
就我而言,我的模型中有 avatar 和 avatar_url 字段,我从视图中调用它,也许这可以在某种程度上帮助你。
片段代码:
def get_remote_image(self):
if self.avatar_url and not self.avatar:
img_temp = NamedTemporaryFile(delete=True)
img_temp.write(urlopen(self.avatar_url).read())
img_temp.flush()
self.avatar.save(f"avatar_img_{self.pk}.jpeg", File(img_temp))
self.save()
推荐阅读
- string - 生成所有可能的长度为 l 且具有 n 个字符的字符串
- laravel - HTML默认选择选项作为vue数据的默认值
- aweber - Aweber:“缺少必需的参数:[电子邮件]”
- java - JVM 是否可以选择自动加密其内存?
- animation - [three.js][编辑] CesiumMan 不能走路
- javascript - 无法在 JavaScript 中使用 putImageData 更新 HTML5 画布像素颜色
- php - 用于在 wordpress 中向 html 标签添加属性的 PHP 代码
- apache-spark - Pyspark:如何聚合 Pyspark 列表中所有元素的数据?
- components - Springboot @Component 和 @Autowired 注解,但仍然得到空指针异常
- oracle - 带有select的sql oracle程序