Django order_by() 在 PythonAnywhere 上不适合我
Posted
技术标签:
【中文标题】Django order_by() 在 PythonAnywhere 上不适合我【英文标题】:Django order_by() is not working for me on PythonAnywhere 【发布时间】:2016-06-18 04:39:48 【问题描述】:由于某种原因 order_by() 在查询集上对我不起作用。我已经尝试了我能想到的一切,但我的 Django/mysql 安装似乎没有使用 order_by() 方法做任何事情。该列表似乎只是处于相当无序的状态,或者是在我看不到的某些基础上排序的。
我的 Django 安装是 1.8。
我的一个模型示例如下:
class PositiveTinyIntegerField(models.PositiveSmallIntegerField):
def db_type(self, connection):
if connection.settings_dict['ENGINE'] == 'django.db.backends.mysql':
return "tinyint unsigned"
else:
return super(PositiveTinyIntegerField, self).db_type(connection)
class School(models.Model):
school_type = models.CharField(max_length=40)
order = PositiveTinyIntegerField(default=1)
# Make the identity of db rows clear in admin
def __str__(self):
return self.school_type
这是我认为的相关行:
schools = School.objects.order_by('order')
起初我认为问题与使用了非标准 PositiveTinyIntegerField() 有关,该非标准 PositiveTinyIntegerField() 由我在某个网站上找到的某个类定义,该类允许我使用 MySQL Tiny Integer 字段。但是,当我按“id”或“school_type”排序时,列表仍然保持在我看来相当随机的顺序。
我可以放入我自己的循环,在查询集被检索后对其进行排序,但我真的更愿意解决这个问题,这样我就可以使用标准的 Django 方法。
希望有人能看出问题出在哪里。
【问题讨论】:
如果DEBUG = True
,您的查询应该被记录。你能显示来自django.db.connection.queries
的记录查询吗?
order_by 似乎不太可能不起作用。更有可能是数据库中的字段具有与您预期不同的值,或者您没有运行您认为正在运行的代码。
我自己在管理员中更改了订单列上的值。刚刚重新检查过它们,我可以向你保证它们是正确的。此外,如果我将视图更改为 .filter(id=1),列表中只会出现一项,所以这绝对是我正在处理的正确代码。至于日志记录。 Debug=True 在设置文件中设置,但我没有将任何 SQL 发送到任何日志。这个 *** 帖子的底部响应似乎有一个方法,但是当我将这些行添加到 settings.py 并重新启动应用程序时,我的 SQL 查询仍然没有记录。
Opps,参考的帖子在这里:***.com/questions/971667/…
您确定在更改代码后重新加载服务器吗?如果您显示完整的视图和模板,它可能会显示问题。
【参考方案1】:
在 cmets 的帮助下,我设法解决了这个问题。我尝试使用 sys.write.stdout(str(school)) 将学校对象写入标准输出。然后,日志向我显示,事实上数据的排序是正确的,所以问题必须在于数据在被模板呈现之前是如何打包的。
我前段时间写了这个视图,然后才决定要对其进行排序,所以结果证明问题是由每个学校对象(带有相关数据的附加树)被读入字典引起的。一旦我将数据类型更改为列表,学校就会按照我的预期顺序呈现。
【讨论】:
以上是关于Django order_by() 在 PythonAnywhere 上不适合我的主要内容,如果未能解决你的问题,请参考以下文章
Django order_by() 在 PythonAnywhere 上不适合我
080:Django数据库QuerySet API详解-order_by: