2013-04-03 129 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