Как получить байты из BinaryField в Django? - PullRequest
0 голосов
/ 29 декабря 2018

Предположим, у нас есть модель с 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'

Так что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Итак, вот вывод: BinaryField могут быть назначены байты и могут быть прочитаны как байты.

В вышеприведенном коде хеширование было сделано неправильно, и правильный путь:

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

0 голосов
/ 29 декабря 2018

Что касается вашего обновления о AttributeError, вы неправильно вызываете метод hexdigest().

Дело в том, что метод update() возвращает None, и вы в значительной степенипытаюсь позвонить hexdigest() на None.Подобные вызовы метода цепочки работают, только если предыдущий метод возвращает фактический объект вместо None.

Этот вызов необходимо выполнить в несколько этапов:

def __str__(self):
    m = hashlib.md5()
    m.update(self.image)
    return m.hexdigest()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...