Django QuerySet过滤器没有捕获ValueError?

时间:2017-05-17 15:38:32

标签: django

我正在尝试过滤Django QuerySet。我知道有时过滤条件无效。在这种情况下,我想抓住错误。这是一个愚蠢的人为例子:

models.py:

from uuid import uuid4
from django.db import models

class MyModel(models.Model):
    class Meta:
        app_label = "my_app"
        abstract = False
    guid = models.UUIDField(default=uuid4, editable=False)


try:
    my_filtered_models = MyModel.objects.filter(guid='invalid_guid')
except ValueError:
    print "you messed up"

现在这应该引发一个ValueError,因为'invalid_guid'不是一个有效的uuid - 它应该是''9a3c21a5-09f7-4676-9ecf-c1672fa69bc0',显然是这样的。但我从未到达except区块。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

来自django documentation,引用

  

class UUIDField(** options)[source]¶

     

用于存储通用唯一标识符的字段。使用Python的UUID类。在PostgreSQL上使用时,它以uuid数据类型存储,否则存储在 char(32)中。

另外,来自python docs,引用

  

class uuid.UUID(hex = None,bytes = None,bytes_le = None,fields = None,int = None,version = None)

     

32个十六进制数字字符串创建UUID,字符串16字节作为字节参数字符串16字节以little-endian顺序作为bytes_le参数,作为字段的六个整数的元组(32位time_low,16位time_mid,16位time_hi_version,8位clock_seq_hi_variant,8位clock_seq_low,48位节点)参数,或单个128位整数作为int参数

具体到这一点,

<强>更新

最后,我明白了。 实际上,django确实会引发错误。

我将用一个简单的例子来说明,

试试你的代码,

my_filtered_models = MyModel.objects.filter(guid='invalid_guid')

此代码不会引发错误,因为try语句包含将您刚才执行的查询结果赋值给变量“my_filtered_models”。但是,如果您尝试打印或访问my_filtered_variable,则会引发ValueError。

逸岸,

MyModel.objects.filter(guid='invalid_guid')

此语句引发ValueError。我自己删除了我之前的答案,也为我错误的答复道歉。

所以,你的代码,

try:
    my_filtered_models = MyModel.objects.filter(guid='invalid_guid')
except ValueError:
    print "you messed up"

不会输入except,因为每次运行时,ValueError都会分配给my_filtered_models。只有在访问变量时,才会引发错误。

希望你得到你想要的东西。

答案 1 :(得分:0)

检查invalid_pk它可能在valid_pk的范围内。 您能否发布有关valid_pk的更多信息