Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Django';s ORM_Django_Django Orm - Fatal编程技术网

使用Django';s ORM

使用Django';s ORM,django,django-orm,Django,Django Orm,足够简单的例子-我有一点Django代码,它以queryset开始 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 = que

足够简单的例子-我有一点Django代码,它以queryset开始

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')
现在,由于需要进行过滤的灵活方式,可能
某些\u foo
某些\u bar
变量的类型不正确(例如,我们可能会得到一个空字符串,试图对整型字段进行过滤)因此,这段代码可能最终引发
TypeError
ValueError

这很好,我可以适当地处理这个案例,但从ORM合同中我不清楚的是,我应该在什么时候提出这些例外情况

  • 它会出现在
    .filter()
    语句中吗
  • …或在
    .get()
    语句中
  • …或者是在未指定的情况下,并且我可以在其中一个上处理它?(例如,可能取决于数据库后端的实现?)

要回答原始问题,在生成新的查询集时,调用过滤器时会引发
字段错误
值错误

>>> 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'

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

也许我遗漏了什么,但我需要问:你为什么要打电话到查询集?filter()和get()有不同的用途,它们都执行查询。并且filter()是第一个查询-->在筛选过程中将引发类型/值错误的过滤器。您无法访问get()注意:好的,我可以看到在这种特殊情况下,它似乎是由
.get()
语句引发的(这是我所期望的),但不清楚我是否可以安全地依赖此行为来保持一致。@SamueleMattiuzzo筛选器语句可能被链接。最后一个
.get()
是执行查询时单个对象的查找的位。是的,我知道它们是如何工作的:)我只是想知道为什么要混合它们(实际上,我从来没有这样做过;我不确定这是否是一个好的实践,因为它们的含义确实不同)。如果对一批对象执行“空”get()(就像您正在做的那样),您将遇到一个MultipleObjectsReturned错误(请参阅文档)。这就是为什么我要问:)他们以同样的方式做同样的事情,但期望得到不同的结果。如果要过滤结果并只接收一个obj,则应使用get with parameters。@SamueleMattiuzzo在我的特定上下文中这样做非常明智,并且查找保证返回0或1个结果,因为其中一个或两个链式过滤器都是唯一的。
kwargs
模式可能更好。
FieldError
异常(字段名称不正确)与
TypeError
(提供给过滤器的类型不正确)略有不同。前者似乎立即发生,但后者似乎在实际进行查找时发生。尽管如此,我还是会接受答案,因为我认为kwarg模式是处理歧义的正确方法。