更好的Django过滤方式,看看对象是否存在

时间:2016-08-17 17:40:41

标签: python django

很多时候,我发现自己过滤了一个对象,如果找不到它,则返回None。但是,我这样做的方法似乎效率很低(就代码行而言)

当我过滤对象时,我通常会这样做:

person = Person.objects.filter(id=id)
if person:
    person = Person.objects.get(id=id)
else:
    person = None

有更好的方法吗?

修改 我做了一些编辑,以澄清我的混乱。 过滤器查询应始终返回1个对象(如果存在)。

5 个答案:

答案 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),它检索结果然后检查是否   任何人都归还了。