2014-02-26 31 views
1

我有一個模型,我不能挽救我的目標,讓我們這樣說:Django的測試 - 當我使用的查詢集得到它

class Invoice(models.Model): 
    client_name = models.CharField(max_length=100) 

而且我有一個看起來像一個文件:

def foo_1(): 
    for inv in Invoice.objects.all(): 
     inv.client_name = "Joe" 
     inv.save() 

def foo_2(inv): 
    inv.client_name = "Joe" 
    inv.save() 
發生

我的問題,當我測試:

class FooCase(TestCase): 
    def test_foo(self): 
     inv = Invoice("Jack") 

     print inv.client_name # output Jack, OK 
     foo_1() 
     print inv.client_name # output Jack, KO ! 
     print inv.client_name # output Jack, OK 
     foo_2(inv) 
     print inv.client_name # output Joe, OK 

我不明白,爲什麼在兩個型動物的行爲:(

我添加了一個修改日期來我的模型,並嘗試將其輸出到foo_1前後循環for後,save似乎能正常工作,但很喜歡的對象是不同的...

我不'不知道這是否有幫助,但我也輸出vars(invoice)test_foo然後從foo_1()和最後從foo_2()。狀態是一樣的test_foofoo_2()<django.db.models.base.ModelState object at 0x32ca090>),但不是在foo_1()<django.db.models.base.ModelState object at 0x32cc650>

+0

它給你什麼錯誤?或者它只是不把它保存到數據庫? – Hoopdady

+0

噢,在你運行inv.save()之前,'inv = Invoice(「Jack」)'也不會在數據庫中,所以它不會受'foo_1()'的影響。我也非常感興趣的是,最終的'inv.client_name'輸出是'Joe',看起來應該是'LOL'。 – Hoopdady

+0

即使在調用foo_1之前保存'inv','inv'也不會受到'foo_1'的影響。 – lanzz

回答

3

的Django每次從數據庫中檢索的記錄時間返回不同的對象:

>>> i1 = Invoice.objects.all()[0] 
>>> i2 = Invoice.objects.get(pk=i1.pk) 
>>> i1 == i2 
True // since model instances compare by their id field only 
>>> id(i1) == id(i2) 
False // since they are actually separate instances 

您實例inv = Invoice("Jack")調用foo_1之前,所以foo_1更新所有的發票後,你仍然有舊inv實例,這不是招(foo_1實例化其模型對象本身,它們是不同的實例,不會影響inv)並且尚未從數據庫重新加載 - 沒有任何修改inv.client_name,儘管數據庫中的記錄已更新。另一方面,foo_2適用於您作爲參數傳遞的特定實例,因此您會看到已更改的client_name;即使您沒有保存實例,您實際上也會看到該更改。

+0

這顯然現在你已經解釋說,非常感謝:) – Thom

1

,當你將它保存傑克不會被保存在數據庫中。您尚未爲您的查詢創建一個對象到數據庫進行迭代。但是,你確實有一個可以傳遞的對象。這就是爲什麼你可以改變對象屬性並保存它們。