【问题标题】:Django Query Result Is NoneType?Django 查询结果是 NoneType?
【发布时间】:2013-03-25 20:24:27
【问题描述】:

我的查询如下所示:

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

它工作正常,所以我可以在模板中使用结果。但是,我需要将其中的一个值从整数更改为 timedelta,以便在模板输出中显示时间。在执行此操作时遇到困难,我想知道为什么键入结果并发现 type(blah) 告诉我它是 NoneType,即使它实际上具有可用的值。这很令人费解,我在 Django 文档中找不到任何关于此的内容。

我尝试使用blah['length'] 来获取我的特定整数,但这不起作用。所以看起来类型不是字典、集合或列表。

那么,Django 查询结果是什么类型,为什么它告诉我它是 NoneType 即使它不是?

我真的在这个问题上摸不着头脑。

【问题讨论】:

  • 上面例子中的blah永远不能是None,如果没有找到结果,它可能会返回一个空的django.db.models.query.QuerySet。您的问题出在其他地方。
  • 如果问题出在其他地方,那就太奇怪了,因为除非我在模板中使用结果对象之前尝试以某种方式使用结果对象,否则代码工作正常。我想我今晚有一些试验和错误摆在我面前。叹息。

标签: django python-3.x django-views


【解决方案1】:

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)

【讨论】:

  • 感谢查询集的链接,我还没有找到那个页面。我在看docs.djangoproject.com/en/dev/topics/db/queries。我尝试了您建议的代码,甚至使用了 int(),但 Django 仍然抛出错误 - “int() 参数必须是字符串或数字,而不是 'NoneType'”。
  • Django 没有引发该异常。这意味着您传递给int 而不是它可以转换的数字。你必须确保你传递的任何东西都是一个有效的数字。
  • 本例中model.time 的值在数据库中为248,因此无需处理None。谢谢你。
  • 无论如何都尝试了代码,它工作正常。诡异的!谢谢!现在,我认为它正在处理一些 None,然后才到达我认为我正在处理的那个。
猜你喜欢
  • 2011-09-28
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 2011-06-05
  • 2021-11-10
相关资源
最近更新 更多