Django查询数据类型是否重要?

时间:2016-02-21 06:53:29

标签: django

我一直在使用Django ORM in查询来测试特定模型实例的id是否属于id列表。

from app.models import StudentModel

students = StudentModel.objects.filter(id__in=[1, 2, 3])

我正在构建的ID列表是通过Django getlist函数。

list_ids = request.GET.getlist('sid', [])

因此,上面的列表实际上是一个字符串列表,而不是整数。

list_ids = ['1', '2', '3']

以下过滤器仍可使用

students = StudentModel.objects.filter(id__in=['1', '2', '3'])

不只是in,Django ORM get的工作方式也相同。

student = StudentModel.objects.get(id=1)
student = StudentModel.objects.get(id='1')

我在文档中也找不到这种行为。

我正在填充的列表已经是一个字符串列表(由于request.GET.getlist)。所以我的问题是,我应该更喜欢彼此,因为查询也使用字符串。

1 个答案:

答案 0 :(得分:2)

您可以使用已在问题中执行的整数或字符串。但是,如果传入一个无法强制转换为int的值 - 例如.get(id='Hello World') - 模型将在您的代码中引发异常。

如果你传递一个int,你在查询时不太可能出错。但是,如果您确定它们会正确强制执行int(例如使用正则表达式来验证字符串),则传递字符串没有坏处。

两者都能正常工作,因为模型字段会自动转换传递的值。例如,IntegerField通过调用int()来转换所需的传递值:

 class IntegerField(Field):

     def get_prep_value(self, value):
         value = super(IntegerField, self).get_prep_value(value)
         if value is None:
             return None
         return int(value)

     def to_python(self, value):
         ...
         try:
             return int(value)
         except (TypeError, ValueError):
             raise ...

这也意味着.get(int_field=1.0)将起作用 - 浮点数转换为int!

不幸的是,大多数这些行为都没有记录 - 您需要直接查看源代码。但是,Django中的大多数字段都将采用字符串或字段本身的类型。