2016-02-26 88 views
-3

我有兩種型號:ItemPhotoItem是foreignkeykey Photo所以一個項目可以有很多照片連接,這是很平常的。Django。相關型號在主模型保存後返回無

項目類:

class Item(models.Model): 
name = models.CharField('Item Name', 
    max_length = 150, 
    null = False, 
    blank = False 
) 
description = RichTextField('Item Description') 

照片類:

class Photo(models.Model): 

path_and_rename = PathAndRename() 

photo = models.ImageField(upload_to = path_and_rename, blank = True, null = True) 
item = models.ForeignKey('Item', related_name = 'photo_set') 

當我創建新Item條目以一堆照片我想要做一些額外的東西:發出異步任務索引和電子郵件通知用戶 - some_async_task()。我試圖通過Item.save()方法來做到這一點:

def save(self): 
    super(Item, self).save() 

    some_async_task.delay(self.id) 


@task(name="something") 
def something(item_id): 
    print Item.objects.get(pk=item_id).photo_set.first().photo.url 

看來項目模型save()方法正是我需要的,但問題是,即使調用super()後,我無法獲得有關相關照片條目,因爲這樣的數據關係不存在。

在創建物料輸入和所有相關照片條目相關後,運行方法的最佳方式是什麼?

post_save信號不固定的情況。

+5

請張貼部分代碼 –

+0

對不起。現在無法訪問控制檯,因此無法粘貼錯誤代碼。稍後更新 – Hazaard

回答

0

由於Item是主要模型和照片是相關的,這意味着,當Item保存它不一定有關係的照片,但。

要知道這是什麼時候發生的: 「要在創建物料輸入後運行方法,並且所有相關的照片條目都是相關的」 是取決於您的業務邏輯的。

您是否知道在您的視圖中何時添加了所有照片?

如果是:那麼請在您的視圖代碼中調用任務。

如果沒有:

+0

感謝Risadinha。我在'Item'對象上實際上使用了'post_save'信號。結果是一樣的。因此,似乎最好調整Photo.save()方法或將post_save信號綁定到Photo並在每次更新照片時運行任務。此外,我確實將'睡眠(10)'函數放在異步任務的頂部,因此在實際查詢被傳遞到數據庫時,所有條目都被更新並且關係被保存。它的工作原理。但我仍然不喜歡這樣的做法。 – Hazaard

+0

稍微思考了一下(這永遠都是必要的:),很明顯,這樣的邏輯應該只能進入視野。把所有東西都放進模型和鏈接信號是不好的主意。只有視圖完全控制了相關模型的流程,所以我需要的每個東西都只是在'item.save()'代碼之後把我的異步任務調用到視圖中。 – Hazaard