我正在尝试过滤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
区块。
有什么建议吗?
答案 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的更多信息