0

私は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 ..]

では、このコードをどこにプラグインできますか?ビュー内でこれを実行できることは知っていますが、モデルに埋め込む方法はありますか?キャッシュは管理者に入力しないでください。代わりに、キャッシュと画像の特定の組み合わせが必要な場合はいつでもキャッシュを生成する必要があります。

おそらく簡単ですが、グーグルの正しいキーワードが不足しています。

4

1 に答える 1

2

仮定:

  1. 特定のサイズの画像の「表現」をその場でロードできるようにする必要があります。
  2. サイズモデルは、表現が持つことができる事前定義されたサイズのセットを格納します。

ここでのコンテキストではより理にかなっていると思うので、キャッシュモデルを表現と呼びます。

このプロセスのエントリポイントは、明らかにビューです。リクエストが届き、「Image1.jpg」@800x600を検索する必要があると判断しました。最も簡単なアプローチは、クエリをビューに直接配置することです。ただし、再利用性を確保するには、次のいずれかを実行する方がよい場合があります。

  • 次にビューから呼び出されてRepresentationオブジェクトを取得するユーティリティ関数
  • PictureとSizeを外部キーとしてすでに参照しているため、Representationモデルのクラスメソッド。
  • 表現モデルでカスタムマネージャーを使用して、上記と同様のことを行う

これらのいずれも、他の誰かが独自のビューを持ち、Repインスタンスを直接取得する必要がある場合に、アプリとして再利用できるようにします。

擬似コードはこのプロセスが画像モードにあることを示していますが、外部キーが両方含まれており、適切な担当者がいるかどうかを簡単に確認できるため、おそらく表現モデルにあるはずです。そうでない場合は、作成します。

ビューは、すべてのロジックを持つのではなく、単純なものを呼び出すだけで済みます。

# as classmethod
rep = Representation.get_cached_picture(picture, size)
# or with a manager
rep = Representation.objects.get_cached_picture(picture, size)
于 2012-04-22T21:40:16.347 に答える