gpt4 book ai didi

django - 使用 Django 的 ORM 时什么时候会引发异常

转载 作者:行者123 更新时间:2023-12-02 11:31:36 26 4
gpt4 key购买 nike

足够简单的示例 - 我有一些以查询集开头的 Django 代码...

queryset = MyModel.objects.all()

稍后它会根据一些可配置选项执行各种过滤...

if something:
queryset = self.queryset.filter(foo=some_foo)

if another_thing:
queryset = self.queryset.filter(bar=some_bar)

最后它执行查找...

try:
obj = queryset.get()
except ObjectDoesNotExist:
raise ValidationError('Does not exist')

现在,由于需要以灵活的方式进行过滤,因此 some_foosome_bar 变量的类型可能不正确(例如,我们尝试过滤整数字段时可能会得到一个空字符串。)因此此代码最终可能会引发 TypeErrorValueError

没关系,我可以适本地处理这种情况,但是从 ORM 合约中我不清楚的是,在什么时候我应该期望引发这些异常。

  • 它会出现在 .filter() 语句中吗?...
  • ...或者在 .get() 语句上?...
  • ...或者未指定,我将其处理为能够发生在其中一个上? (例如,也许取决于数据库后端的实现?)

最佳答案

为了回答最初的问题,当构建新的查询集时,在调用过滤器时会引发 FieldErrorValueError:

>>> a = Account.objects.all()
>>> a = a.filter(id=3)
>>> a = a.filter(no_exist=3)
<snip>
FieldError: Cannot resolve keyword 'no_exist' into field. Choices are: active, created_on, group, id, ...

>>> a = Account.objects.all()
>>> a = a.filter(id='abc')
ValueError: invalid literal for int() with base 10: 'abc'

我还要补充一点,这种模式对我来说似乎具有误导性,因为filter通常用于返回模型的列表/可迭代,而不是像一个那样获取。为了清晰和更容易地处理异常,我建议使用这种模式:

kwargs = {}
if something:
kwargs['foo'] = some_foo
if another_thing:
kwargs['bar'] = some_bar

# handle if kwargs is empty
try:
obj = MyModel.objects.get(**kwargs)
except (FieldError, ValueError, ObjectDoesNotExist):
raise ValidationError('Does not exist')

另一个额外的好处是,IIRC,克隆查询集的工作相对昂贵,因此您可以忽略该开销,同时使代码更清晰。回到你的问题,使用这种模式,毫无疑问会在哪里引发异常。

关于django - 使用 Django 的 ORM 时什么时候会引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14158087/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com