我想在我的应用程序中实现一个功能,但我不知道如何去做。我想要的是:我有一个使用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)
答案 0 :(得分:2)
我的建议是在crontab作业中运行django脚本,比如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()