3

当然有更好的方法来做到这一点?

results = []
if not queryset is None:
    for obj in queryset:
        results.append((getattr(obj,field.attname),obj.pk))

问题是有时查询集是 None ,当我尝试迭代它时会导致异常。在这种情况下,我只想将结果设置为一个空列表。这段代码来自 Django 视图,但我认为这并不重要——这似乎是一个更普遍的 Python 问题。

编辑:我发现是我的代码将一个空的查询集变成了一个“无”而不是返回一个空列表。能够假设查询集始终是可迭代的,通过允许删除“if”语句来简化代码。下面的答案可能对遇到相同问题但无法修改其代码以保证查询集不是“无”的其他人有用。

4

4 回答 4

19
results = [(getattr(obj, field.attname), obj.pk) for obj in queryset or []]
于 2009-01-30T12:22:05.390 回答
8

怎么样

for obj in (queryset or []):
    # Do your stuff

它与 JF Sebastians 的建议相同,只是没有作为列表理解实现。

于 2009-01-30T12:44:35.670 回答
2

对于它的价值,Django 管理器有一个“无”查询集,您可以使用它来避免无缘无故的无检查。使用它来确保您没有空查询集可以简化您的代码。

if queryset is None:
    queryset = MyModel.objects.none()

参考:

于 2009-02-06T23:23:36.170 回答
1

你可以使用列表推导,但除此之外我看不出你可以改进什么

result = []
 if queryset:
     result = [(getattr(obj, field.attname), obj.pk) for obj in queryset]
于 2009-01-30T12:16:41.873 回答