如何在Django中连接多个模块?

时间:2012-04-22 20:28:22

标签: django django-1.4

我有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 ..]

那我在哪里可以插入这段代码?我知道我可以在视图中执行此操作,但有没有办法将其嵌入到模型中?不应该在管理员中填充缓存,而应该在需要缓存和图片之间的某种组合时生成缓存。

这可能很容易,但我缺乏谷歌的正确关键字。

1 个答案:

答案 0 :(得分:2)

假设:

  1. 您希望能够动态加载特定大小的图像“表示”。
  2. 尺寸模型将存储一个表示形式可以具有的预定义尺寸集。

  3. 我将把你的缓存模型称为 Representation ,因为我认为这在上下文中更有意义。

    这个过程的切入点显然是一个观点。请求进来,您确定需要搜索“Image1.jpg”@ 800x600。最简单的方法就是将查询直接放入视图中。但是对于可重用性,最好是执行以下任何操作:

    • 实用程序函数,然后从视图中调用以检索表示对象
    • 您的Representation模型的类方法,因为您已经将图片和大小称为外键。
    • 在Representation模型上使用custom manager执行与上述类似的操作

    如果其他人拥有自己的观点并且需要直接检索Rep实例,那么任何这些都将使其可以作为应用程序重用。

    虽然你的伪代码指的是这个过程处于图片模式,但我认为它应该在Representation模型上,因为它包含两个外键,你可以很容易地看到你是否有一个正确的代表。如果没有,请创建它。

    视图应该只需要调用一些简单的东西,而不是拥有所有的逻辑:

    # as classmethod
    rep = Representation.get_cached_picture(picture, size)
    # or with a manager
    rep = Representation.objects.get_cached_picture(picture, size)