我一直在使用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
)。所以我的问题是,我应该更喜欢彼此,因为查询也使用字符串。
答案 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中的大多数字段都将采用字符串或字段本身的类型。