0

假设我有一个模型:

class Calls(models.Model): 
    callid = models.AutoField(primary_key=True)
    altid = models.BigIntegerField()
    calldate = models.DateField(auto_now=True, verbose_name='Call Date')
    followupdate = models.DateField(blank=True,null = True, verbose_name='Follow-up Date')

我想做的是:

Calls.objects.order_by("followupdate").distinct('altid')

但是由于我使用的是 MySQL,因此我似乎无法在特定字段上使用 distinct。根据文档中的第一个注释distinct。当我尝试运行时,我收到一个错误。NotImplementedError: DISTINCT ON fields is not supported by this database

下面是我的表的一个最小示例,以及我想如何查询以采取行动。逗号分隔的值分别表示:callid、altid、calldate 和 followupdate。

是)我有的:

1,1,yesterday,thursday
2,2,yesterday,next wednesday
3,1,thursday,next thursday

我想要的是:

2,2,yesterday,next wednesday
3,1,thursday,next thursday

注意:我无法更改为 PostgreSQL

我怎样才能做到这一点?

4

1 回答 1

1

也许不是最有效的解决方案(我的直觉告诉我,如果集合具有某种不同的 lambda 函数或其他东西,集合可能会稍微好一些……),但很容易做到:

results = Calls.objects.order_by("followupdate")
newresults = []

seen_altid = []

for result in results:
    if result.altid not in seen_altids:
        seen_altids.append(result.altid)
        newresults.append(result)

不过,顺便说一句,如果您使用此解决方案,听起来您想订购,-followupdate这样您将获得 3,1 而不是 1,1

编辑:jk,http ://www.peterbe.com/plog/uniqifiers-benchmark似乎支持我这个解决方案。稍微修改一下 seen 是一个字典,大概是 O(1) 查找。如果您需要,这很酷(尽管除非您的结果集大小很大,否则可能真的没有必要)

于 2013-02-23T00:14:31.850 回答