重写 save 方法,将其从图像字段 Django 保存为 base64

问题描述 投票:0回答:1

模型.py


def upload_org_logo(instance, filename):
    ts = calendar.timegm(time.gmtime())
    filepath = f"org_logo/{ts}"
    if instance:
        filepath = f"org_logo/{instance.org_id}/{instance.org_name}"
    base, extension = os.path.splitext(filename.lower())
    return filepath

class Organisation(models.Model):
    """
    Organisation model
    """
    org_id = models.CharField(max_length=50,default=uuid.uuid4, editable=False, unique=True, primary_key=True)
    org_name = models.CharField(unique=True,max_length=100)
    org_code = models.CharField(unique=True,max_length=20)
    org_mail_id = models.EmailField(max_length=100)
    org_phone_number = models.CharField(max_length=20)
    org_address = models.JSONField(max_length=500, null=True)
    product = models.ManyToManyField(Product, related_name='products')
    org_logo = models.ImageField(upload_to=upload_org_logo, default='blank.jpg', blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    org_logo_b64 = models.BinaryField(blank=True, null=True)


    def save(self, *args, **kwargs):
        if self.org_logo:
            logo = open(self.org_logo.url, "rb")
            print(logo)
            self.org_logo_b64 = base64.b64encode(logo.read())
            super(Image, self).save(*args, **kwargs)

当我尝试发帖时,它向我抛出错误

FileNotFoundError at /admin/onboarding/organisation/7577ef5f-356c-4cbd-8ef6-e906382447ff/change/
[Errno 2] No such file or directory: '/media/white-logo.png'
Request Method: POST
Request URL:    http://127.0.0.1:8000/admin/onboarding/organisation/7577ef5f-356c-4cbd-8ef6-e906382447ff/change/
Django Version: 3.2.12
Exception Type: FileNotFoundError
Exception Value:    
[Errno 2] No such file or directory: '/media/white-logo.png'
Exception Location: F:\PM-Onboarding-Service\Onboarding-Service\microservices\onboarding\models.py, line 244, in save

我尝试了基于此答案的方法django admin:像base64一样保存图像

我的媒体设置是:

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

任何人都可以帮助我通过覆盖图像字段的保存方法将图像以base64形式保存在数据库中吗?

更新后:

    def save(self, *args, **kwargs):
        if self.org_logo:
            logo = self.org_logo.open()
            print(logo)
            self.org_logo_b64 = base64.b64encode(logo.read())
            super(Organisation, self).save(*args, **kwargs)

保存方法看起来像这样,当我添加带有徽标的组织时,它会被发布,但在 org_logo_b64 列中,它仅显示为 [binarydata] 而不是二进制值。

如果我在没有添加 org_logo 的情况下发布内容,则会抛出错误“

ValueError at /admin/onboarding/organisation/add/
Cannot add "<Product: Project management>": instance is on database "None", value is on database "default"
Request Method: POST
Request URL:    http://127.0.0.1:8000/admin/onboarding/organisation/add/
Django Version: 3.2.12
Exception Type: ValueError
Exception Value:    
Cannot add "<Product: Project management>": instance is on database "None", value is on database "default"
Exception Location: C:\Users\gobs4\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\fields\related_descriptors.py, line 1055, in _get_target_ids
Python Executable:  C:\Users\gobs4\AppData\Local\Programs\Python\Python310\python.exe
Python Version: 3.10.4
Python Path:    
['F:\\PM-Onboarding-Service\\Onboarding-Service\\microservices',
 'C:\\Users\\gobs4\\AppData\\Local\\Programs\\Python\\Python310\\python310.zip',
 'C:\\Users\\gobs4\\AppData\\Local\\Programs\\Python\\Python310\\DLLs',
 'C:\\Users\\gobs4\\AppData\\Local\\Programs\\Python\\Python310\\lib',
 'C:\\Users\\gobs4\\AppData\\Local\\Programs\\Python\\Python310',
 'C:\\Users\\gobs4\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages']
Server time:    Mon, 09 May 2022 12:15:28 +0530
django django-models django-rest-framework base64
1个回答
1
投票

如果没有

save
:
,更新版本和原始版本的 
self.org_logo

方法都会返回而不保存
    def save(self, *args, **kwargs):
        if self.org_logo:
            logo = self.org_logo.open()
            print(logo)
            self.org_logo_b64 = base64.b64encode(logo.read())
            super(Organisation, self).save(*args, **kwargs)

尝试在最后一行添加

return super(Organisation, self).save(*args, **kwargs)
(这实际上是 else 情况),或者更好的是减少当前最后一行的缩进,使其在
if
else
情况下执行:

    def save(self, *args, **kwargs):
        if self.org_logo:
            logo = self.org_logo.open()
            print(logo)
            self.org_logo_b64 = base64.b64encode(logo.read())
        return super(Organisation, self).save(*args, **kwargs)
© www.soinside.com 2019 - 2024. All rights reserved.