验证django视图中是否存在对象而不返回404的正确方法是什么?

验证django视图中是否存在对象而不返回404的正确方法是什么?,django,django-views,Django,Django Views,我需要验证一个对象是否存在并返回该对象,然后根据该对象执行操作。不返回404的正确方法是什么 try: listing = RealEstateListing.objects.get(slug_url = slug) except: listing = None if listing: 如果没有404,我不会使用404包装器。这是意图的滥用。只要抓住实干家就行了 try: listing = RealEstateListing.objects.get(slug_url

我需要验证一个对象是否存在并返回该对象,然后根据该对象执行操作。不返回404的正确方法是什么

try:
    listing = RealEstateListing.objects.get(slug_url = slug)
except:
    listing = None

if listing:

如果没有404,我不会使用404包装器。这是意图的滥用。只要抓住实干家就行了

try:
    listing = RealEstateListing.objects.get(slug_url=slug)
except RealEstateListing.DoesNotExist:
    listing = None
您还可以执行以下操作:

if not RealEstateListing.objects.filter(slug_url=slug).exists():
    # do stuff...

有时使用
try:except:
block更为清晰,而其他情况下,一行
存在()
会使代码看起来更清晰。。。这一切都取决于您的应用程序逻辑

我会做得很简单,如下所示:

listing = RealEstateListing.objects.filter(slug_url=slug).first() 
listing = RealEstateListing.objects.filter(slug_url=slug)
if listing:
    # do stuff


我不认为有必要尝试/抓住。如果结果中可能有多个对象,则使用first(),如用户Henrik Heino所示:是的,这是一个比公认的更好的解决方案,如果您不想要404.yap,这似乎是更好的解决方案此解决方案比
exists()更有效
如果您需要对对象执行某些操作。我喜欢添加
值\u list('id',flat=True)
。如果我只想看看是否存在
listing=RealEstateListing.objects.values\u list('id',flat=True).get(slug\u url=slug)
我发现这种语法的奇怪之处在于
RealEstateListing.doesnotextest
指的是模型,而不是对象本身。为什么它不是
realestatesting.objects.get(slug\u url=slug).DoesNotExist
?.exists()更快:这是更好的方法,应该有答案。我假设
exists()
不适用于
get()
,对吗?请注意,只有当您不打算使用有问题的对象时,此解决方案才有效。否则(如在OPs情况下)它是错误的,并且比公认的解决方案慢得多:如果您稍后执行
get()
,它将向数据库发送第二个查询。如果您正在检查是否存在以对对象执行某项操作(如果存在),则我更喜欢
try except
而不是
exists()
。Rasiel,我可以建议你考虑接受另一个答案吗?这似乎是正确的方法,而且已经被比我们所接受的答案多了一点。我可以考虑一下,但是在Django 1.2中介绍了,它是在2010 5月17日发布的,如果你注意到我的问题是在09提交的……这是当时的正确答案。如果Exists()现在被认为是最好的方法,那么我想选择第二个答案在语义上是正确的,对吗?Rasiel,这在当时是正确的答案。但是stackoverflow网站似乎是在为人们的问题寻找解决方案的同时,建立一套好的/官方的问题,并提供最好的答案。因此,我建议选择现在“正式正确”的答案。
如果列表:
应该是
否则:
。如果您以后需要使用潜在对象,这是最好的解决方案,因为它只需要一个赋值,并且避免使用try/except块。请注意,您可以稍后简单地使用
测试是否存在,如果清单:
避免try/except是一种不好的做法。软件开发最重要的一个方面是控制异常的可用性,这是为了能够提供良好的用户体验。让人们知道什么东西不能正常工作。第二如果要测试QuerySet是否存在,请使用.exists()否则为对象。使用主键测试是否存在。。。。如果object.pk://run code(),则此查询比检索对象的所有数据快得多。您只想知道是否存在。已经存在使用try/except和
.exists()的解决方案。我认为这是一个好主意,所以有多个不同的答案如何做事情。如果对象存在,可能这对那些也希望使用该对象的人来说更好。如果try/except应该避免与否,我不会制定任何规则。有时是好的,有时是坏的,例如,如果您只想生成非常紧凑的代码。除非您对查询集执行.first()或在条件中执行.first(),否则这将始终返回True.not True,django==False中的空queryset