2012-04-22 4 views
0

私は3つのモデルを持っています。Djangoで複数のモジュールを接続するには?

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オブジェクトを作成します。サイズとピクチャごとに、必要に応じてCacheオブジェクトを生成する必要があります。

私の問題は、コードをどこに置くべきかわかりません。

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

このコードはどこで接続できますか?ビュー内でこれを行うことはできますが、モデルに埋め込む方法はありますか?キャッシュは管理者ではなく、キャッシュとピクチャの特定の組み合わせが必要なときに生成されるべきです。

これはおそらく簡単ですが、Googleには適切なキーワードが欠けています。

+0

カップルの質問...なぜあなたはときあなたの写真とサイズを関連付けるために別のモデルが必要なのかpicture.imagefieldはモデルの幅と高さを保存しますか?キャッシュモデルの目的は何ですか?それはちょうどイメージデータを複製するようですか?モデルスニペットを投稿し、見つけようとしている正確なコードとは対照的に、あなたが達成しようとしていることをもう少し詳しく説明できますか? – jdi

+0

これは、画像のサイズを複数にすることを目的としています。ピクチャモジュールは元のイメージを保持し、キャッシュモジュールは複数のサイズ変更されたバージョンを保持します。あなたの返事をありがとう、私は私の質問を改善しようとします。 – JasonTS

+1

ああ、そうです。その情報は間違いなく役立ちます。あなたのキャッシュモデルは本当にバージョンの多くです。私はあなたが手動でキャッシングを試みることによって間違った方向に向かっていると思っていました。モデルを表示するために質問を更新してください。また、この使用法の例も示してください。 – jdi

答えて

2

仮定:

  1. あなたはその場で特定のサイズで画像の「表現」を読み込むことができるようにしたいです。
  2. サイズモデルには、表現が持つことができる所定のサイズのセットが格納されます。

私はそれがここでは文脈により理にかなっていると思うので、私は表現としてあなたのキャッシュモデルを参照するつもりです。

このプロセスのエントリポイントは、明らかにビューになります。リクエストが届き、 "Image1.jpg" @ 800x600を検索する必要があると判断しました。最も簡単なアプローチは、クエリをビューに直接入れることです。あなたがいますので、

  • その後、ビューから呼び出されたユーティリティ関数が
  • あなたの表現モデルのクラスメソッド表現オブジェクトを取得するために:しかし、再利用のために、次のいずれかを実行する方がよいかもしれませんピクチャとサイズを外部キーとして参照します。
  • 上記

に似た何かを表現モデルにcustom managerを使用して他の誰かが自分の意見を持っていたし、単に担当者のインスタンスを取得するために必要な場合は、これらのいずれかがアプリとしてそれを再利用可能になります直接。

あなたの擬似コードはピクチャモードでこのプロセスを参照していますが、私はそれがおそらくRepresentationモデル上にあるはずです。外部キーと外部キーの両方が含まれています。そうでない場合は作成してください。

ビューはロジックのみの全てを有するのとは対照的に、単純な何かをコールする必要があります:

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

ありがとう、それは多くの助けになります:) – JasonTS

+0

@JasonTS:いつでも!質問を更新していただきありがとうございます。モデルコードを見て、それをどのように使いたいかを正確に伝えることができたら、視覚化するのはずっと簡単でした。 – jdi

関連する問題