很多时候,我发现自己过滤了一个对象,如果找不到它,则返回None
。但是,我这样做的方法似乎效率很低(就代码行而言)
当我过滤对象时,我通常会这样做:
person = Person.objects.filter(id=id)
if person:
person = Person.objects.get(id=id)
else:
person = None
有更好的方法吗?
修改 我做了一些编辑,以澄清我的混乱。 过滤器查询应始终返回1个对象(如果存在)。
答案 0 :(得分:2)
如果您想获得一个人或返回无,请使用var jsRandomNumber = 0
function getRandomInt(min, max) {
jsRandomNumber = Math.floor(Math.random() * (max - min + 1)) + min;
alert(jsRandomNumber);
window.cpAPIInterface.setVariableValue('randomnumber', jsRandomNumber);
}
getRandomInt (1, 3)
function randomQuizGenerator() {
if (jsRandomNumber == 1) {
window.open("http://www.w3schools.com");
window.cpAPIInterface.next();
} else {
window.cpAPIInterface.next();
}
}
randomQuizGenerator()
。
.get()
答案 1 :(得分:2)
你不能这样做。
health
Shows application health information (when the application is secure, a simple ‘status’ when accessed over an unauthenticated connection or full message details when authenticated).
会引发异常。
你能做的是:
person = Person.objects.get(name=name)
但最好的事情是使用:
try:
person = Person.objects.get(name=name)
except Person.MultipleObjectsReturned:
person = Person.objects.first()
except Person.DoesNotExist:
person = None
答案 2 :(得分:1)
您的if/else
不正常,因为您指定了person
两次。我不明白为什么。我认为你有两种选择。
首先,您可以将if/else
简化为if
,如下所示:
person = Person.objects.filter(name=name)
if not person:
person = None
或使用coalescing operator使其非常简洁:
person = Person.objects.filter(name=name) or None
如果person = None
是假的,那么会返回Person.objects.filter(name=name)
。
答案 3 :(得分:1)
过滤返回列表(或空列表),所以如果你知道你得到列表,并想要用空替换空列表:
persons = Person.objects.filter(name=name)
if not any(person):
person = None
# single person
person = persons[0] # but there could be more than one
如果你想要单身人士
try:
person = Person.objects.get(name=name)
except Person.MultipleObjectsReturned:
# do something if there is more Persons with that name
person = Person.objects.first() # for example return first person with that name
except Person.DoesNotExist:
person = None # set person None
答案 4 :(得分:1)
您可以使用exists()
来自docs:
如果您只想确定是否存在至少一个结果(并且不需要实际对象),则使用exists()会更有效。
entry = Entry.objects.get(pk=123)
if some_queryset.filter(pk=entry.pk).exists():
print("Entry contained in queryset")
else:
return None
如果需要关注代码行,可以稍微缩短一下。但是:
此外,如果还没有评估some_queryset,那么你 知道它会在某个时刻,然后使用some_queryset.exists() 将做更多的整体工作(存在检查的一个查询加上一个 额外的一个以后检索结果)而不是简单地使用 bool(some_queryset),它检索结果然后检查是否 任何人都归还了。