我有兩個Django模型,ModelA
和ModelB
。後者與前者有着外部關係。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。
如果找不到保存ModelB實例的代碼,是什麼讓你認爲我們可以通過有限的代碼訪問? – hspandher
使用你的代碼,ModelB不應該存在,你的過濾器查詢應該是空的。您可以創建並保存ModelA,並僅使用篩選條件搜索ModelB,該篩選條件搜索鏈接到ModelA的ModelB實例。這可能只適用於ModelA上的post_save處理程序,該處理程序創建並保存了連接到ModelA的ModelB實例。 至於爲什麼這在生產中起作用:您確定您看到的生產代碼仍然與系統部署時運行的代碼相同嗎?如果沒有重新啓動,您可能會看到比生產服務器使用的文件更新的* .py文件... – ingofreyer
是的,抱歉 - 這是張貼在絕望中。你完全正確@ingofreyer - 我發現問題是在MySQL數據庫中有這種行爲的觸發器 - 觸發器已經被複制到本地數據庫中。絕對沒有任何代碼可以說這是在發生! – qmsack