Django: 整数字段的order_by和filter

3

I have this:

#models.py

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=30)
    result = models.IntegerField()

#views.py

 def MyView(request):
    foo = MyModel.objects.order_by('result')
    return render_to_response('foo.html', {'foo': foo})

而不是按照以下方式排序整数值:

1、3、5、24、45

我得到的是:

1、24、3、45、5(按字符串排序)

解决方案如下:

#views.py

def MyView(request):
    foo = MyModel.objects.all()
    foo = foo.extra(select={'result': 'CAST(result AS INTEGER)'}).extra(order_by = ['result'])
    return render_to_response('foo.html', {'foo': foo})

我希望你能够像这样做(将筛选器作为整数而不是字符串):
#views.py
def MyView(request):
    foo = MyModel.objects.all()
    foo = MyModel.objects.filter(result__gt = 50)

它返回例如:6、7、9;不返回例如100、200等。

如何实现?


6
你确定result数据库列实际上是一个IntegerField吗?你的结果似乎指向了一个CharField。如果在syncdb后更改字段类型,它不会更新数据库为新类型。 - Sam Dolan
你说得对。我以为syncdb会更新我的每一个更改,但事实并非如此。我所做的是删除数据库并从头开始创建。现在它可以正常工作了。 - proggix
4
在将来的开发中使用South(http://south.aeracode.org/)可以帮助缓解类似问题的困扰。我也觉得内置的syncdb没有触发alter-table语句很奇怪。在使用South之前,保持模型和数据库同步真的非常麻烦。 - Brandon Taylor
1个回答

0

我之前遇到过这个问题,它发生在数据库字段设置为Char / Varchar而不是Int的情况下。

您需要进入数据库并更改字段类型,以确保您可以正确排序和过滤。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接