Python 重复数据消除和重新排序字典
假设我们有一个基本模型Python 重复数据消除和重新排序字典,python,django,Python,Django,假设我们有一个基本模型 class Log(models.Model): key = fields.BigInteger() calldate = fields.DateTimeField() followupdate = fields.DateTimeField() 同一密钥可以设置多个followupdates。我想做的是在列表中显示最近按calldate计划的后续行动 在我看来,我有以下几点: views.py 我需要的帮助是按照followupdate键对字典r
class Log(models.Model):
key = fields.BigInteger()
calldate = fields.DateTimeField()
followupdate = fields.DateTimeField()
同一密钥可以设置多个followupdates。我想做的是在列表中显示最近按calldate计划的后续行动
在我看来,我有以下几点:
views.py
我需要的帮助是按照followupdate键对字典results进行重新排序。在每个字典中都有这样一个键:“followupdate”:datetime.date2013,3,25这是我需要重新排序的 .sort似乎是这样工作的-
l.sort(key=lambda item:item['followupdate'], reverse=True)
测试用例-
>>> l = [{'followupdate': datetime.date(2013, 3, 25)}, {'followupdate': datetime.date(2013, 3, 24)}, {'followupdate': datetime.date(2013, 3, 29)}]
>>> l
[{'followupdate': datetime.date(2013, 3, 25)}, {'followupdate': datetime.date(2013, 3, 24)}, {'followupdate': datetime.date(2013, 3, 29)}]
>>> l.sort(key=lambda item:item['followupdate'], reverse=True)
>>> l
[{'followupdate': datetime.date(2013, 3, 29)}, {'followupdate': datetime.date(2013, 3, 25)}, {'followupdate': datetime.date(2013, 3, 24)}]
.sort似乎是这样工作的-
l.sort(key=lambda item:item['followupdate'], reverse=True)
测试用例-
>>> l = [{'followupdate': datetime.date(2013, 3, 25)}, {'followupdate': datetime.date(2013, 3, 24)}, {'followupdate': datetime.date(2013, 3, 29)}]
>>> l
[{'followupdate': datetime.date(2013, 3, 25)}, {'followupdate': datetime.date(2013, 3, 24)}, {'followupdate': datetime.date(2013, 3, 29)}]
>>> l.sort(key=lambda item:item['followupdate'], reverse=True)
>>> l
[{'followupdate': datetime.date(2013, 3, 29)}, {'followupdate': datetime.date(2013, 3, 25)}, {'followupdate': datetime.date(2013, 3, 24)}]
您应该让数据库执行重复数据消除,而不是从数据库中获取记录,然后在Python中丢弃这些记录,这是浪费时间和带宽的 Django的对象关系映射无法做到这一点,但您可以在SQL中这样做:
SELECT L1.*
FROM myapp_log AS L1,
(SELECT MAX(date) AS maxdate, `key`
FROM myapp_log GROUP BY `key`) as L2
WHERE L1.date = L2.maxdate
AND L1.`key` = L2.`key`
AND L1.followupdate IS NOT NULL
ORDER BY L1.date DESCENDING
字段名键需要引用,因为它是SQL关键字
然后,您可以使用从Django运行此查询,如下所示:
SELECT L1.*
FROM myapp_log AS L1,
(SELECT MAX(date) AS maxdate, `key`
FROM myapp_log GROUP BY `key`) as L2
WHERE L1.date = L2.maxdate
AND L1.`key` = L2.`key`
AND L1.followupdate IS NOT NULL
ORDER BY L1.date DESCENDING
sql='1〕
从myapp_日志中选择L1.*作为L1,
等等,见上文
'
q=Log.objects.rawsql
您应该让数据库执行重复数据消除,而不是从数据库中获取记录,然后在Python中丢弃这些记录,这是浪费时间和带宽的 Django的对象关系映射无法做到这一点,但您可以在SQL中这样做:
SELECT L1.*
FROM myapp_log AS L1,
(SELECT MAX(date) AS maxdate, `key`
FROM myapp_log GROUP BY `key`) as L2
WHERE L1.date = L2.maxdate
AND L1.`key` = L2.`key`
AND L1.followupdate IS NOT NULL
ORDER BY L1.date DESCENDING
字段名键需要引用,因为它是SQL关键字
然后,您可以使用从Django运行此查询,如下所示:
SELECT L1.*
FROM myapp_log AS L1,
(SELECT MAX(date) AS maxdate, `key`
FROM myapp_log GROUP BY `key`) as L2
WHERE L1.date = L2.maxdate
AND L1.`key` = L2.`key`
AND L1.followupdate IS NOT NULL
ORDER BY L1.date DESCENDING
sql='1〕
从myapp_日志中选择L1.*作为L1,
等等,见上文
'
q=Log.objects.rawsql
在Python中,dict是无序的。您可以做的是创建一个键、值的列表,这些元素将被排序。在python中排序和排序是不同的概念吗?如果是的话,也许我只是想排序。在Python中,dict是无序的。您可以做的是创建一个键、值的列表,这些元素将被排序。在python中排序和排序是不同的概念吗?如果是的话,也许我只是想排序。我也推荐这种方法。效率更高。我想使用它,但我对SQL有点太不熟悉,无法编写原始语句。感谢您的回复+1@BrandonBertelsen我建议你开始用SQL把你的手弄脏。ORM破坏了一个。我相信我唯一会使用的SQL足以将整个表拉到Python或R中,在那里真正神奇的发生了。不确定是否值得!这正是我选择Django的原因,因为它可以让我避免弄乱我不知道的事情!我也推荐这种方法。效率更高。我想使用它,但我对SQL有点太不熟悉,无法编写原始语句。感谢您的回复+1@BrandonBertelsen我建议你开始用SQL把你的手弄脏。ORM破坏了一个。我相信我唯一会使用的SQL足以将整个表拉到Python或R中,在那里真正神奇的发生了。不确定是否值得!这正是我选择Django的原因,因为它可以让我避免弄乱我不知道的事情!这工作如预期,但我不得不改变它一点。sortkey=lambda x:x.followupdate,reverse=TrueAh是。我以为是字典。应该是一个对象。这按预期工作,但我必须对其进行一些更改。sortkey=lambda x:x.followupdate,reverse=TrueAh是。我以为是字典。应该是一个对象。