通过. Update () ORM更新Django ImageField



这里也有类似的问题:

  • 在django中更新ImageField,不需要表单,和
  • 当使用update()方法时,Django ImageField不更新

但答案一直是相同的("使用.save()而不是") -这个解决方案确实工作,但由于我无法控制的模型上的信号,我想知道是否有任何可以替代使用的变通方法。

# serializers.py
from drf_extra_fields.fields import Base64ImageField
from rest_framework import serializers

class ProfileSerializer(serializers.Serializer):
email = serializers.CharField(required=False, allow_null=True)
image = Base64ImageField(required=False, allow_null=True, max_length=None, use_url=True)
# views.py
def get_as_base64(url: AnyStr):
if url is None:
return None, None
full_name = url.split("/")[-1]
my_base = base64.b64encode(requests.get(url).content)
return my_base, full_name
def do_profile_update(profile: Dict):
b64_image, file_name = get_as_base64(profile.get("url"))
if b64_image and file_name:
*_, file_ext = file_name.split(".")
b64_image = f"data:image/{file_ext};base64,{b64_image.decode('utf-8')}"
build_dict = {
"email": profile.get("email"),
"image": b64_image,
}
serializer = ProfileSerializer(data=build_dict)
serializer.is_valid()  # returns True
# serializer.validated_data = {'email': 'test@example.org', 'image': <SimpleUploadedFile: 11735acf-6d96-4c62-9e6a-8ebb7f7ea509.jpg (image/jpeg)>}
Profile.objects.filter(pk=pk).update(**serializer.validated_data)  # This saves the *name* of the image to the database, but no image file
我理解ImageField基本上是一个CharField,我可以看到名称数据库中的图像,但该图像未写入服务器。

我的问题归结为:是否有一种方法可以单独将图像写入服务器,检索新保存的图像的路径,并在.update()中使用它?

TYIA .

你可以使用django的DefaultStorage类将你的文件单独保存到media server(参见docs)。

import os
import io
import requests
from django.conf import settings
from django.core.files.images import ImageFile
from django.core.files.storage import default_storage
response = requests.get(url)
full_name = url.split("/")[-1]
img_path = os.path.join(settings.MEDIA_ROOT, full_name)
image = ImageFile(io.BytesIO(response.content))
default_storage.save(img_path, image)

相关内容

  • 没有找到相关文章

最新更新