2017-10-06 172 views
-2

我有兩個Django模型,ModelAModelB。後者與前者有着外部關係。Django - 模型實例被保存(或不)

class ModelA(models.Model): 
    item = models.BooleanField(default=True) 

class ModelB(models.Model): 
    modela = models.ForeignKey(ModelA) 
    answer = models.SmallIntegerField(null=True, blank=True) 

在生產代碼中,保存了ModelA的一個實例。在相同的功能中,它似乎會自動保存ModelB的實例,因爲這是在模板中訪問的。

def view(request): 

    a = ModelA() 
    a.item = True 
    a.save() 

    b = ModelB.objects.filter(modela_id=a.id) 

    return render(request, 'template.html', context=locals()) 

首先,雖然這是我想要的代碼工作,我不知道的ModelB實例是如何被保存。 (這是繼承代碼 - 我無法在代碼庫的任何其他地方找到信號或調用ModelB)。其次,這種行爲已經停止在本地開發工作(但仍然在生產中,使用相同的代碼);但是,這種行爲已經停止在本地開發工作。 ModelB未保存,所以b返回None。我很確定這不是代碼問題,因爲代碼的舊分支有相同的問題。我曾嘗試恢復我的本地數據庫到以前的版本,無濟於事。最近唯一改變的是我壓縮了一大堆遷移文件。

任何人都可以幫助解決這些問題嗎?我正在運行Django 1.11。

+0

如果找不到保存ModelB實例的代碼,是什麼讓你認爲我們可以通過有限的代碼訪問? – hspandher

+1

使用你的代碼,ModelB不應該存在,你的過濾器查詢應該是空的。您可以創建並保存ModelA,並僅使用篩選條件搜索ModelB,該篩選條件搜索鏈接到ModelA的ModelB實例。這可能只適用於ModelA上的post_save處理程序,該處理程序創建並保存了連接到ModelA的ModelB實例。 至於爲什麼這在生產中起作用:您確定您看到的生產代碼仍然與系統部署時運行的代碼相同嗎?如果沒有重新啓動,您可能會看到比生產服務器使用的文件更新的* .py文件... – ingofreyer

+1

是的,抱歉 - 這是張貼在絕望中。你完全正確@ingofreyer - 我發現問題是在MySQL數據庫中有這種行爲的觸發器 - 觸發器已經被複制到本地數據庫中。絕對沒有任何代碼可以說這是在發生! – qmsack

回答

0

由於意見是正確的,這裏是問題的答案:

有了你給我們的代碼,ModelB不應該存在,你的過濾器的查詢應該是空的。您可以創建並保存ModelA,並僅使用篩選條件搜索ModelB,該篩選條件搜索鏈接到ModelA的ModelB實例。

如果您在ModelA上有一個post_save處理程序,它可以創建並保存連接到ModelA的ModelB實例,這隻能用。

至於爲什麼這在生產中有效:這可能會通過替換當前* .py文件的新代碼發生,但是不會重新啓動服務器。正如問題的作者所發現的那樣,MySQL觸發器創建了ModelB實例。該觸發器在開發系統中不可用。

相關問題