1

基本的なモデルがあるとしましょう。

class Log(models.Model):
    key = fields.BigInteger()
    calldate = fields.DateTimeField()
    followupdate = fields.DateTimeField()

同じキーに複数のfollowupdatesを設定できます。私がやりたいのは、リストに最後に(呼び出し日で)スケジュールされたフォローアップを表示することです。

私の見解では、私は以下を持っています:

# views.py

def callbacks(request):
    """ get objects where a followupdate has been specified """
    q = Log.objects.filter(followupdate__isnull = False).order_by("-calldate")

    """ deduplicate key so only most recently scheduled followupdate show """ 
    newresults = []
    seen_key = []   
    for result in q:
        if result.key not in seen_key:
            seen_key.append(result.key)
            newresults.append(result)

    results = newresults
    """ What I want to do is equivalent to results.order_by("followupdate") """
    """ But since it's a dictionary now and not a queryset, I can't """
    return render_to_response('callbacks.html', {"callbacks":results})

私が助けを必要としているのはresults、キーで辞書を並べ替えることfollowupdateです。各辞書には、次のようなキーがあります。'followupdate': datetime.date(2013, 3, 25)これは、並べ替える必要があるものです。

4

2 に答える 2

2

.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)}]
于 2013-03-25T19:34:49.157 に答える
2

時間と帯域幅の浪費である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

(フィールド名keyはSQLキーワードであるため、引用符で囲む必要があります。)

次に、次のようなraw()メソッドを使用して、Djangoからこのクエリを実行できます。

sql = '''
    SELECT L1.* FROM myapp_log AS L1,
    # and so on (see above)
    '''
q = Log.objects.raw(sql)
于 2013-03-25T19:56:19.780 に答える