2012-04-22 21 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/") 

我想按如下方式使用它們:首先生成圖片對象。然後創建大小對象。對於每個大小和圖片,應在需要時生成緩存對象。

我的問題是,我不知道把代碼放在哪裏。它應該是這樣的(僞):

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 2012-04-22 21:12:43

+0

這樣做的目的是讓圖片具有多種尺寸。 Picture模塊將保存原始圖像,而Cache模塊將保存多個調整大小的版本。感謝您的回覆,我會盡力改進我的問題。 – JasonTS 2012-04-22 21:21:14

+1

啊是的。這些信息絕對有用。您的緩存模型實際上更多是版本。我開始認爲你試圖手動進行緩存,正走向錯誤的道路。請更新問題以顯示您的模型以及此用法的示例。 – jdi 2012-04-22 21:23:06

回答

2

假設:

  1. 你希望能夠在在飛行中具有一定規模加載圖像的「代表」。
  2. 尺寸模型將存儲表示法可以具有的預定義尺寸集合。

我會參考你的緩存模型表示,因爲我覺得它更有意義的背景下在這裏。

這個過程的切入點顯然是一個觀點。一個請求進來,你確定你需要搜索「Image1.jpg」@ 800x600。最簡單的方法就是將查詢放入視圖中。但對可重用性,它可能會更好做任何以下內容:

  • 一個效用函數,然後從視圖中調用來檢索的表現對象
  • 您表示模型的類方法,因爲你已經將圖片和大小引用爲外鍵。
  • 上表示模型使用custom manager做類似上述

東西任何這些將使其可重複使用的應用程序,如果別人是有自己的看法,並簡單地檢索代理商實例所需直。

雖然你的僞代碼指的是這個過程是在圖片模式,我認爲它應該可能在代表模型上,因爲它包含了兩個外鍵,並且你可以很容易地看到你是否有合適的代表。如果沒有,創建它。

視圖應該只需要調用一些簡單的,而不是讓所有的邏輯:

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

謝謝,這有助於很多:) – JasonTS 2012-04-22 21:44:39

+0

@JasonTS:隨時!感謝您更新您的問題。一旦我看到模型代碼並且可以準確地告訴你想要如何使用它,這更容易形象化。 – jdi 2012-04-22 21:45:35