【问题标题】:How to get bytes from a BinaryField in Django?如何从 Django 中的 BinaryField 获取字节?
【发布时间】:2019-05-27 02:40:21
【问题描述】:

假设我们有一个带有BinaryField 的模型:

from django.db import models
import hashlib

class Target(models.Model):
    # ...
    image = models.BinaryField(max_length=(1<<24)-1)
    # ...
    def __str__(self):
        return hashlib.md5().update(self.image).hexdigest()

上述代码是否正确计算了图像的 MD5 摘要? 或者BinaryField 内部是否有一些方法或变量来获取内存以传递给update() 方法?

更新:当我尝试时:

>>> from pathlib import Path
>>> t = Target(image=Path('../../Experiments/LoginError2.jpg').read_bytes())
>>> t

我收到以下错误:

AttributeError: 'NoneType' object has no attribute 'hexdigest'

那我做错了什么?

【问题讨论】:

  • 那么当你尝试这个时发生了什么? (您至少必须使用self.image 才能访问该值)
  • A BinaryFieldIntFieldStringField 没有区别,访问它以获取值。
  • @MartijnPieters,我刚开始用 Python 编程,所以我觉得很难尝试,因为我还没有实现上传图片的方法。
  • @SergeRogatch 你可以写一个小号test 来一探究竟。或者您甚至可以使用manage.py shell 创建模型来测试行为。
  • 我已经用我尝试加载图像时发生的结果更新了我的问题。

标签: python django memory hash binary


【解决方案1】:

所以结论如下:BinaryField 可以被分配字节并且可以被读取为字节。

上面的代码中散列是错误的,正确的做法是:

hashlib.md5(self.image).hexdigest()

【讨论】:

    【解决方案2】:

    关于您对AttributeError 的更新,您错误地调用了hexdigest() 方法。

    问题是,update() 方法返回 None,而您几乎试图在 None 上调用 hexdigest()。只有在前一个方法返回一个实际对象而不是 None 时,这样的链接方法调用才有效。

    您必须分多个步骤执行此调用:

    def __str__(self):
        m = hashlib.md5()
        m.update(self.image)
        return m.hexdigest()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2019-09-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多