1

我想在我的应用程序中实现一个功能,但我不知道如何去做。我想要的是:我有一个模型类,它使用 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)
4

1 回答 1

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()
于 2010-09-24T12:02:05.200 回答