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

おそらく最も効率的な解決策ではありません(セットにある種の明確なラムダ関数などがある場合、セットを使用した方がわずかに優れている可能性があることが私の直感でわかります...)が、簡単に実行できます:

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ただし、このソリューションを使用する場合は、1,1 ではなく 3,1 になるように注文したいようです。

編集: jk、http ://www.peterbe.com/plog/uniqifiers-benchmarkは、このソリューションで私をバックアップしているようです。おそらく O(1) ルックアップのために、見たのが辞書であるというわずかな変更があります。必要な場合はクールです(ただし、結果セットのサイズが非常に大きくない限り、おそらく不要です)

于 2013-02-23T00:14:31.850 に答える