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

Ras*_*iel 85 django django-views

我需要验证一个对象是否存在并返回该对象,然后根据该执行操作.在没有返回404的情况下,这样做的正确方法是什么?

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

if listing:
Run Code Online (Sandbox Code Playgroud)

zza*_*art 179

你也可以

if not RealEstateListing.objects.filter(slug_url=slug).exists():
    # do stuff...
Run Code Online (Sandbox Code Playgroud)

有时使用try更清楚:除了:阻塞和其他时间单行存在()使代码看起来更清晰......所有这些都取决于你的应用程序逻辑.

  • 请注意,此解决方案仅在您不打算使用相关对象时才有效.否则(就像OPs情况一样)它是错误的并且比接受的解决方案慢很多:如果稍后执行`get()`,它将向数据库发送第二个查询. (8认同)
  • .exists()更快:https://docs.djangoproject.com/en/dev/ref/models/querysets/#exists (6认同)
  • 这是更好的方法,应该有答案 (6认同)
  • 我假设`exists()`不能用`get()`,对吧? (2认同)

iro*_*ggy 103

如果你没有给404,我不会使用404包装器.这是误用意图.只需抓住DoesNotExist即可.

try:
    listing = RealEstateListing.objects.get(slug_url=slug)
except RealEstateListing.DoesNotExist:
    listing = None
Run Code Online (Sandbox Code Playgroud)

  • 如果你需要对对象做一些事情,这个解决方案比`exists()`更好. (3认同)
  • 我喜欢添加`values_list('id',flat = True)`。如果我只需要看看是否存在`listing = RealEstateListing.objects.values_list('id',flat = True).get(slug_url = slug)` (2认同)

Hen*_*ino 8

listing = RealEstateListing.objects.filter(slug_url=slug).first() 
Run Code Online (Sandbox Code Playgroud)

  • 如果您稍后需要使用潜在对象,这是最好的解决方案,因为它只需要一次赋值,并且避免了必须使用 try/except 块。请注意,您可以稍后简单地使用 `if listing:` 测试是否存在 (2认同)
  • 已经有一个使用 try/except 和 `.exists()` 的解决方案。我认为在 SO 中有多个不同的答案如何做事是个好主意。也许这对于那些也想使用该对象(如果它存在)的人更好。无论是否应该避免尝试/除外,我都不会制定任何规则。有时它是好的,有时它是坏的,例如,如果你只想制作非常紧凑的代码。 (2认同)