Я работаю над приложением Django, в котором я хотел бы заполнить несколько полей в моей модели при первом создании объекта.В настоящее время я могу сделать это в подпрограмме save()
моей модели следующим образом:
def save(self, *args, **kwargs):
file = fileinfo.getfileinfo(self.file_path)
if not self.file_size:
self.file_size = file.FileSize
if not self.file_inode:
self.file_inode = file.FileInode
if not self.duration:
self.duration = file.Duration
if not self.frame_width:
self.frame_width = file.ImageWidth
if not self.frame_height:
self.frame_height = file.ImageHeight
if not self.frame_rate:
self.frame_rate = file.VideoFrameRate
super(SourceVideo, self).save(*args, **kwargs)
Я создал функцию с именем getfileinfo
в отдельном модуле с именем fileinfo
.Вот как выглядит часть моей функции:
def getfileinfo(source):
fstats = os.stat(source)
info = dict({
u'FileSize': fstats.st_size,
u'FileInode': fstats.st_ino
})
output = subprocess.Popen(
[exiftool, '-json', source], stdout=subprocess.PIPE)
info.update(
json.loads(output.communicate()[0], parse_float=decimal.Decimal)[0])
return DotDict(info)
Хотя все это работает, я бы хотел не блокировать процесс сохранения, если процесс поиска по какой-либо причине будет отложен.Информация не нужна во время создания объекта и может быть заполнена вскоре после этого.Я думал, что я бы изменил свою функцию, чтобы принять как путь к файлу, о котором идет речь , так и в качестве первичного ключа для объекта.С помощью этой информации я мог бы получить эту информацию и затем обновить свою запись объекта как отдельную операцию.
Что-то вроде:
def save(self, *args, **kwargs):
fileinfo.getfileinfo(self.file_path, self.id)
super(SourceVideo, self).save(*args, **kwargs)
Что я хотел бы помочь, так это как вернуться изфункционировать до фактического завершения его.Я хочу вызвать функцию, а затем заставить ее ничего не возвращать, если она была вызвана правильно.Однако функция должна продолжать работать, а затем обновлять объект в конце, как только это будет сделано.Пожалуйста, дайте мне знать, если мне нужно что-то уточнить.Кроме того, что-то еще делает работа?
Спасибо