Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:postgres日期时间排序不正确?_Python_Django_Django Models - Fatal编程技术网

Python Django:postgres日期时间排序不正确?

Python Django:postgres日期时间排序不正确?,python,django,django-models,Python,Django,Django Models,也许这实际上是一个bug,但由于找不到任何暗示它已知的东西,我会假设我做错了什么 我有一个模型,Study,有一个datetime字段和一个描述优先级的对象外键(基本上是一个名称/数字对,这样就可以按数字排序,按名称查看) 我想先按优先级对研究对象进行排序(这样可以先将它们按更高的优先级进行分组),然后再按日期时间、最早的优先级进行排序。这样,Stat将位于列表的顶部,最早的将排在第一位,以此类推 使用我的测试数据库,即sqlite,它的工作原理与预期的一样: ordered = ordered

也许这实际上是一个bug,但由于找不到任何暗示它已知的东西,我会假设我做错了什么

我有一个模型,Study,有一个datetime字段和一个描述优先级的对象外键(基本上是一个名称/数字对,这样就可以按数字排序,按名称查看)

我想先按优先级对研究对象进行排序(这样可以先将它们按更高的优先级进行分组),然后再按日期时间、最早的优先级进行排序。这样,Stat将位于列表的顶部,最早的将排在第一位,以此类推

使用我的测试数据库,即sqlite,它的工作原理与预期的一样:

ordered = ordered = models.Study.objects.all().order_by('arrived').order_by('-priority__priority')
for study in ordered:
    print(study.arrived, study.priority)

(datetime.datetime(2013, 5, 15, 23, 22, tzinfo=<UTC>), <StudyPriority: STAT>)
(datetime.datetime(2013, 5, 15, 23, 20, 51, 948639, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 15, 23, 21, 6, 674582, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 15, 23, 21, 21, 86984, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 15, 23, 21, 36, 234965, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 15, 23, 21, 59, 618850, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 15, 23, 22, 18, 991499, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 15, 23, 22, 26, 229715, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 15, 23, 22, 31, 150896, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 15, 23, 22, 35, 379259, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 15, 23, 22, 43, 207465, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 15, 23, 31, 42, 176697, tzinfo=<UTC>), None)
ordered=ordered=models.Study.objects.all()
有秩序地学习:
打印(学习、到达、学习、优先级)
(datetime.datetime(2013,5,15,23,22,tzinfo=),)
(datetime.datetime(2013,5,15,23,20,51948639,tzinfo=),)
(datetime.datetime(2013,5,15,23,21,6674582,tzinfo=),)
(datetime.datetime(2013,5,15,23,21,2186984,tzinfo=),)
(datetime.datetime(2013,5,15,23,21,36,234965,tzinfo=),)
(datetime.datetime(2013,5,15,23,21,59618850,tzinfo=),)
(datetime.datetime(2013,5,15,23,22,18,991499,tzinfo=),)
(datetime.datetime(2013,5,15,23,22,26,229715,tzinfo=),)
(datetime.datetime(2013,5,15,23,22,31,150896,tzinfo=),)
(datetime.datetime(2013,5,15,23,22,35,379259,tzinfo=),)
(datetime.datetime(2013,5,15,23,22,43,207465,tzinfo=),)
(datetime.datetime(2013,5,15,23,31,42,176697,tzinfo=),无)
另一方面,使用生产数据库(postgres),事情。。。出错:

ordered = models.Study.objects.all().order_by('arrived').order_by('-priority__priority')
for study in ordered:
    print(study.arrived, study.priority)

(datetime.datetime(2013, 5, 29, 22, 31, 45, tzinfo=<UTC>), None)
(datetime.datetime(2013, 5, 29, 22, 36, 15, tzinfo=<UTC>), <StudyPriority: STAT>)
(datetime.datetime(2013, 5, 29, 22, 36, 20, 520912, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 29, 22, 35, 18, 784721, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 29, 22, 35, 44, 540762, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 29, 22, 35, 51, 355645, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 29, 22, 35, 56, 800284, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 29, 22, 36, 2, 190325, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 29, 22, 36, 15, 137803, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 29, 22, 31, 44, 759514, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 29, 22, 37, 52, 264583, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 29, 22, 37, 54, 191852, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 29, 22, 37, 56, 385968, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 29, 22, 37, 57, 865427, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 29, 22, 38, 1, 959433, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 29, 22, 38, 4, 748306, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 29, 22, 36, 57, 562198, tzinfo=<UTC>), <StudyPriority: LOW>)
(datetime.datetime(2013, 5, 29, 22, 34, 37, 909631, tzinfo=<UTC>), <StudyPriority: LOW>)
ordered=models.Study.objects.all()
有秩序地学习:
打印(学习、到达、学习、优先级)
(datetime.datetime(2013,5,29,22,31,45,tzinfo=),无)
(datetime.datetime(2013,5,29,22,36,15,tzinfo=),)
(datetime.datetime(2013,5,29,22,36,2050912,tzinfo=),)
(datetime.datetime(2013,5,29,22,35,18,784721,tzinfo=),)
(datetime.datetime(2013,5,29,22,35,44540762,tzinfo=),)
(datetime.datetime(2013,5,29,22,35,51355645,tzinfo=),)
(datetime.datetime(2013,5,29,22,35,56800284,tzinfo=),)
(datetime.datetime(2013,5,29,22,36,219325,tzinfo=),)
(datetime.datetime(2013,5,29,22,36,15,137803,tzinfo=),)
(datetime.datetime(2013,5,29,22,31,44759514,tzinfo=),)
(datetime.datetime(2013,5,29,22,37,52264583,tzinfo=),)
(datetime.datetime(2013,5,29,22,37,54191852,tzinfo=),)
(datetime.datetime(2013,5,29,22,37,56385968,tzinfo=),)
(datetime.datetime(2013,5,29,22,37,57865427,tzinfo=),)
(datetime.datetime(2013,5,29,22,38,1959433,tzinfo=),)
(datetime.datetime(2013,5,29,22,38,4748306,tzinfo=),)
(datetime.datetime(2013,5,29,22,36,57562198,tzinfo=),)
(datetime.datetime(2013,5,29,22,34,37,909631,tzinfo=),)
最明显的烦恼是,不管出于什么原因,postgres都会按照这个顺序首先选择“null”对象priority__priority'是数字优先级值,highest=highest(因此在本例中,null被视为无穷大,而在sqlite中,它被视为-无穷大)。这不是一个大问题,很容易实现一个恼人的解决方法,手动将它们移到底部

真正的问题是日期时间似乎没有被排序!在“低”优先级对象中,时间遍布地图


这可能是ORM中的某种错误,还是我做了一些可以识别的错误,而这些错误恰好不是sqlite的问题?

我想您应该这样做:

ordered = models.Study.objects.order_by('arrived', '-priority__priority')

monokut关于如何正确地按顺序排列的答案是等式的一部分,另一部分是使优先级不为空

您试图在一个可为空的字段上进行排序——该字段始终是一个特定于实现的Monkey扳手。在上面,您试图解释为什么NULL是first或last。它在数据库之间的排序是任意的,不是因为它“等于无穷大”,而是因为它不等于任何东西,甚至不等于它本身。(顺便说一句,在Postgres中,如果您发出一个raw()查询,您可以最后指定NULLS或首先指定NULLS来获得所需的内容,但Django没有提供ORM快捷方式。)

如果需要对列进行排序,可靠的方法是使字段不为NULL,并为其指定一个默认值,该值显式表示“未定义”或“最后一位”,并在每个其他值之前/之后对该值进行排序,以便以可预测的方式对其进行排序。在更深层的极客术语中,这是一个域/类型问题,您试图在一个域中对非类型进行排序,该域不将其作为成员,而不是根据一个显式的“底部”值


在您的示例中,我将创建一个名为“LOWEST”的新优先级类型,将其设置为model字段上的默认值,并将priority_uuupriority设置为1000或0,具体取决于“LOW”相对于“LOW”的含义。然后用lower替换每一个NULL,并将优先级字段更新为notnull。然后,您的排序将在每个系统中按预期工作。(而且你不会对诸如NULL传播表达式nuking之类的通用SQL恼怒/惊奇感到开放。)

我认为你不需要这两个
order\u by()
语句,它们可以组合使用:
ordered=models.Study.objects.all().order\u by('arrighted','-priority\u priority')
你不需要all()either@monkut,作为答案提交!我推测,它似乎对测试数据起作用的原因是,测试数据恰好被插入,因此datetime排序与id排序匹配,这是排序不明确时的默认值。另外,“null”实际上是两个数据库引擎之间的实现差异。thxs,我把它作为一个答案,但不确定它是否能解决这个问题,所以我把它改成了一个评论。很奇怪,从理论上讲,一个人应该能够连锁订购,但你绝对是r