Автоматически обновлять изображения
Я хотел бы реализовать функциональность в моем приложении, но я не знаю, как это сделать. Я хочу вот что: у меня есть класс моделей, который использует imagekit для сохранения своих изображений, и я хотел бы, чтобы пользователи могли легко обновлять изображения для транспортных средств без необходимости редактировать каждую соответствующую запись транспортного средства.
Как они это сделают, так это то, что там будет папка с именем originals
и он будет содержать папки для каждого транспортного средства в формате <stock_number>/PUBLIC
Если пользователь перемещает изображения в PUBLIC
папка для транспортного средства, когда скрипт выполняется, он сравнивает эти изображения с текущими и обновляет их, если они находятся в PUBLIC
папка новее. Если в записи нет изображений, то они будут добавлены. Также, если изображения были удалены из каталога site_media, то их ссылки должны быть удалены из базы данных.
Как я могу сделать это эффективным способом? Мои модели, как показано ниже:
class Photo(ImageModel):
name = models.CharField(max_length = 100)
original_image = models.ImageField(upload_to = 'photos')
num_views = models.PositiveIntegerField(editable = False, default=0)
position = models.ForeignKey(PhotoPosition)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
class IKOptions:
spec_module = 'vehicles.specs'
cache_dir = 'photos'
image_field = 'original_image'
save_count_as = 'num_views'
class Vehicle(models.Model):
objects = VehicleManager()
stock_number = models.CharField(max_length=6, blank=False, unique=True)
vin = models.CharField(max_length=17, blank=False)
....
images = generic.GenericRelation('Photo', blank=True, null=True)
Обновление прогресса Я опробовал код, и пока он работает, я что-то упускаю, так как могу получить изображение, но после этого они не переносятся в site_media/photos
каталог... я должен сделать это или imagekit
будет делать это автоматически? Я немного смущен.
Я сохраняю фотографии так:
Photo.objects.create(content_object = vehicle, object_id = vehicle.id,
original_image = file)
1 ответ
Мой совет - запускать скрипт django в задании crontab, скажем, 5 за 5 минут.
Скрипт погружался в папки с изображениями и сравнивал изображения с записями.
Упрощенный пример:
# Set up the Django Enviroment
from django.core.management import setup_environ
import settings
setup_environ(settings)
import os
from your_project.your_app.models import *
from datetime import datetime
vehicles_root = '/home/vehicles'
for stock_number in os.listdir(vehicles_root):
cur_path = vehicles_root+'/'+stock_number
if not os.path.isdir(cur_path):
continue # skip non dirs
for file in os.listdir(cur_path):
if not isfile(cur_path+'/'+file):
continue # skip non file
ext = file.split('.')[-1]
if ext.lower() not in ('png','gif','jpg',):
continue # skip non image
last_mod = os.stat(cur_path+'/'+file).st_mtime
v = Vehicle.objects.get(stock_number=stock_number)
if v.last_upd < datetime.fromtimestamp(last_mod):
# do your magic here, move image, etc.
v.last_upd = datetime.now()
v.save()