2013-04-03 46 views
0

我有這個疑問,看起來像這樣:Django查詢結果是否爲NoneType?

blah = Blah.objects.filter(foo=title) 

它正常工作,這樣我就可以在模板中使用的結果。但是,我需要將其中的一個值從一個整數更改爲timedelta,以便在模板輸出中顯示一個時間。遇到問題時,我想知道爲什麼鍵入結果是&發現,type(blah)告訴我這是一個NoneType,即使它實際上具有可用的值。這非常令人費解,我在Django文檔中找不到任何關於此的信息。

我嘗試使用blah['length'],以得到我的具體整數,但沒有奏效。所以看起來類型不是字典,集合或列表。

那麼,Django查詢結果是什麼類型,爲什麼它告訴我它是一個NoneType,即使它不是?

我真的在這一塊上撓頭。

+0

'在上面的例子中blah'不應該'None',它可能會返回一個空的'django.db.models.query。 QuerySet'如果沒有結果被發現。你的問題在別處。 – mVChr 2013-04-03 23:13:38

+0

如果問題在別處,那會很奇怪,因爲代碼工作正常,除非我在模板中使用結果對象之前以某種方式使用它。我猜我今晚有些試驗和錯誤。嘆。 – Zamphatta 2013-04-03 23:41:57

回答

0

Django查詢集是它們自己的類型。他們的想法是檢索一組對象,併爲此提供Django的公共查詢集API(docs)。因此,更改任何查詢集屬性可能不是一個好主意,因爲不保證未來的Django版本將具有相同的屬性。但是你可以改變模型實例的屬性,它們返回:

qs = FooModel.objects.all() 
for model in qs: 
    model.attr = 'foo' 

所以你的情況,你可以這樣做:

# assuming you allow your integer field to be null 
class FooModel(models.Model): 
    time = models.IntegerField(null=True) 

qs = FooModel.objects.all() 
for model in qs: 
    # handle case when time is null - model.time will be None 
    t = model.time or 90 
    model.time = timedelta(seconds=t) 

然而,如果你只需要中檢索一個對象(模型實例),然後你應該用get queryset的方法,而不是filter

foo = FooModel.objects.get(...) 
foo.time = timedelta(seconds=foo.time) 
+0

感謝您的查詢集鏈接,我還沒有找到該頁面。我在https://docs.djangoproject.com/en/dev/topics/db/queries/中查找。我嘗試了你所建議的代碼,甚至使用了int(),但Django仍然拋出一個錯誤 - 「int()參數必須是字符串或數字,而不是'NoneType'」。 – Zamphatta 2013-04-03 23:39:39

+0

這個異常不是由Django提出的。這意味着你傳遞給'int'不是它可以轉換的數字。你必須確保你傳遞的是一個有效的數字。 – miki725 2013-04-03 23:43:24

+0

我更新了答案來處理'None'的情況。 – miki725 2013-04-03 23:45:35