我需要验证对象是否存在并返回该对象,然后根据该行为执行操作。什么是不返回404的正确方法?
try:
listing = RealEstateListing.objects.get(slug_url = slug)
except:
listing = None
if listing:
我需要验证对象是否存在并返回该对象,然后根据该行为执行操作。什么是不返回404的正确方法?
try:
listing = RealEstateListing.objects.get(slug_url = slug)
except:
listing = None
if listing:
if listing:
应该是else:
。
Answers:
如果您没有获得404,我就不会使用404包装器。这是对意图的滥用。只需捕获DoesNotExist,即可。
try:
listing = RealEstateListing.objects.get(slug_url=slug)
except RealEstateListing.DoesNotExist:
listing = None
exists()
您需要对对象执行某些操作的效果更好。
values_list('id', flat=True)
。如果我只是需要看是否存在listing = RealEstateListing.objects.values_list('id', flat=True).get(slug_url=slug)
RealEstateListing.DoesNotExist
它引用的是模型,而不是对象本身。为什么不RealEstateListing.objects.get(slug_url=slug).DoesNotExist
呢?
您也可以这样做:
if not RealEstateListing.objects.filter(slug_url=slug).exists():
# do stuff...
有时使用try: except:
块更清晰,而有时使用单行exists()
代码可使代码看起来更清晰……全部取决于您的应用程序逻辑。
exists()
不适用于get()
吧?
get()
稍后再执行,它将向数据库发送第二个查询。
try-except
于exists()
。
listing = RealEstateListing.objects.filter(slug_url=slug).first()
if listing:
.exists()
。我认为在SO中有多个不同的答案如何做事情是个好主意。对于那些也想使用该对象(如果存在)的人来说,这可能更好。如果不会避免使用try / except,我不会制定任何规则。例如,如果您只想编写非常紧凑的代码,则有时是好的,有时是不好的。
我将简单地做如下:
listing = RealEstateListing.objects.filter(slug_url=slug)
if listing:
# do stuff
我认为没有必要尝试/抓住。如果结果中可能存在多个对象,则使用first(),如用户Henrik Heino所示