TIM*_*MEX 193 python django django-queryset
当我要求模型管理器获取一个对象时,它会DoesNotExist
在没有匹配对象时引发.
go = Content.objects.get(name="baby")
Run Code Online (Sandbox Code Playgroud)
相反的DoesNotExist
,我怎么能有go
可以None
代替?
Art*_*ert 289
没有"内置"方式来做到这一点.Django每次都会引发DoesNotExist异常.在python中处理这个问题的惯用方法是将它包装在try catch中:
try:
go = SomeModel.objects.get(foo='bar')
except SomeModel.DoesNotExist:
go = None
Run Code Online (Sandbox Code Playgroud)
我所做的,是子类models.Manager,创建一个safe_get
类似上面的代码,并将该管理器用于我的模型.那样你就可以写:SomeModel.objects.safe_get(foo='bar')
.
Fer*_*xTL 152
从django 1.6开始,您可以像这样使用first()方法:
Content.objects.filter(name="baby").first()
Run Code Online (Sandbox Code Playgroud)
Ama*_*osh 32
get()
DoesNotExist
如果找不到给定参数的对象,则引发异常.此异常也是模型类的属性.该DoesNotExist
异常继承自django.core.exceptions.ObjectDoesNotExist
你可以捕获异常并分配None
去.
from django.core.exceptions import ObjectDoesNotExist
try:
go = Content.objects.get(name="baby")
except ObjectDoesNotExist:
go = None
Run Code Online (Sandbox Code Playgroud)
Ran*_*u R 28
您可以为此创建一个通用函数.
def get_or_none(classmodel, **kwargs):
try:
return classmodel.objects.get(**kwargs)
except classmodel.DoesNotExist:
return None
Run Code Online (Sandbox Code Playgroud)
使用如下:
go = get_or_none(Content,name="baby")
Run Code Online (Sandbox Code Playgroud)
如果没有条目匹配则go将为None否则将返回Content条目.
注意:如果为name ="baby"返回了多个条目,则会引发异常MultipleObjectsReturned
Gau*_*rav 15
你可以这样做:
go = Content.objects.filter(name="baby").first()
Run Code Online (Sandbox Code Playgroud)
现在go变量可以是你想要的对象,也可以是None
参考:https://docs.djangoproject.com/en/1.8/ref/models/querysets/#django.db.models.query.QuerySet.first
Mot*_*ski 13
为了方便起见,这里是我编写的代码片段,基于这里精彩回复的输入:
class MyManager(models.Manager):
def get_or_none(self, **kwargs):
try:
return self.get(**kwargs)
except ObjectDoesNotExist:
return None
Run Code Online (Sandbox Code Playgroud)
然后在你的模型中:
class MyModel(models.Model):
objects = MyManager()
Run Code Online (Sandbox Code Playgroud)
而已.现在你有MyModel.objects.get()以及MyModel.objetcs.get_or_none()
Rya*_*axe 12
你可以使用exists
过滤器:
Content.objects.filter(name="baby").exists()
#returns False or True depending on if there is anything in the QS
Run Code Online (Sandbox Code Playgroud)
如果您只想知道它是否存在,那么这只是另一种选择
小智 9
也许你使用更好:
User.objects.filter(username=admin_username).exists()
Run Code Online (Sandbox Code Playgroud)
在视图中的不同点处理异常真的很麻烦.在models.py文件中定义自定义模型管理器,如
class ContentManager(model.Manager):
def get_nicely(self, **kwargs):
try:
return self.get(kwargs)
except(KeyError, Content.DoesNotExist):
return None
Run Code Online (Sandbox Code Playgroud)
然后将其包含在内容Model类中
class Content(model.Model):
...
objects = ContentManager()
Run Code Online (Sandbox Code Playgroud)
通过这种方式,可以在视图中轻松处理,即
post = Content.objects.get_nicely(pk = 1)
if post:
# Do something
else:
# This post doesn't exist
Run Code Online (Sandbox Code Playgroud)
这是您可能不想重新实现的烦人功能之一:
from annoying.functions import get_object_or_None
#...
user = get_object_or_None(Content, name="baby")
Run Code Online (Sandbox Code Playgroud)
如果您想要一个简单的单行解决方案,不涉及异常处理、条件语句或 Django 1.6+ 的要求,请改为执行以下操作:
x = next(iter(SomeModel.objects.filter(foo='bar')), None)
Run Code Online (Sandbox Code Playgroud)
我认为使用这个主意不错 get_object_or_404()
from django.shortcuts import get_object_or_404
def my_view(request):
my_object = get_object_or_404(MyModel, pk=1)
Run Code Online (Sandbox Code Playgroud)
这个例子相当于:
from django.http import Http404
def my_view(request):
try:
my_object = MyModel.objects.get(pk=1)
except MyModel.DoesNotExist:
raise Http404("No MyModel matches the given query.")
Run Code Online (Sandbox Code Playgroud)
您可以在 Django 在线文档中阅读有关get_object_or_404() 的更多信息。