我有3个模特。
class Picture(models.Model)
name = models.CharField(max_length=255)
image_field = models.ImageField(upload_to="foo/")
slug = models.SlugField()
[...]
class Size(models.Model):
name = models.CharField(max_length=255)
width = models.IntegerField()
height = models.IntegerField()
crop = models.BooleanField(default=True)
upscale = models.BooleanField(default=False)
def __unicode__(self):
return self.name
class Cache(models.Model):
size = models.ForeignKey('Size')
picture = models.ForeignKey('Picture')
image_field = models.ImageField(upload_to="picture/resize/")
我想按如下方式使用它们:首先生成Picture对象。然后创建Size对象。对于每个尺寸和图片,应在需要时生成缓存对象。
我的问题是我不知道在哪里放置代码。它应该像(伪代码):
def get_cached_picture(Picture,Size):
try:
cacheObj = Cache.objects.get(picture=Picture, size=Size):
[.. use cacheObj ..]
except Cache.DoesNotExist:
[.. resize Picture according to Size, insert into cache, use it ..]
那我在哪里可以插入这段代码?我知道我可以在视图中执行此操作,但有没有办法将其嵌入到模型中?不应该在管理员中填充缓存,而应该在需要缓存和图片之间的某种组合时生成缓存。
这可能很容易,但我缺乏谷歌的正确关键字。
答案 0 :(得分:2)
假设:
我将把你的缓存模型称为 Representation ,因为我认为这在上下文中更有意义。
这个过程的切入点显然是一个观点。请求进来,您确定需要搜索“Image1.jpg”@ 800x600。最简单的方法就是将查询直接放入视图中。但是对于可重用性,最好是执行以下任何操作:
如果其他人拥有自己的观点并且需要直接检索Rep实例,那么任何这些都将使其可以作为应用程序重用。
虽然你的伪代码指的是这个过程处于图片模式,但我认为它应该在Representation模型上,因为它包含两个外键,你可以很容易地看到你是否有一个正确的代表。如果没有,请创建它。
视图应该只需要调用一些简单的东西,而不是拥有所有的逻辑:
# as classmethod
rep = Representation.get_cached_picture(picture, size)
# or with a manager
rep = Representation.objects.get_cached_picture(picture, size)