2

すでに多くの同様の質問がなされていると思いますが、コピー&ペーストの解決策を作ることができませんでした。だからここに問題があります:

レポート用にユーザーデータの分析を定期的に計算します。sqliteこれらの計算をデータベースに保存するためのモデルを作成しました。

class report_data(models.Model):
    name = models.TextField()
    matrix = PickledObjectField()
    creation_date = models.DateTimeField('date of creation')

履歴データを永続化するために追加専用スキームを使用しているため、データベースには多くのレコードがあります。

  • 同名
  • 異なるマトリックス
  • 別の作成日

レポートビューには、最新の作成日と一意の名前を持つレコードを含むセットが必要です。残念ながらsqlite、サポートされておらず、ここDISTINCT ONで見つけた解決策は、それが常に最新のマトリックスであることを確認していませんか?

report_data.objects.all().distinct()

これらのレコードはすべてそこのキーによって区別されるため、どちらも機能しません。と同様

report_data.objects.all().latest("creation_date")

name列を考慮せずに最新の要素を1つだけ返すため、機能しません。

私はdjangoの初心者ですが、SQLでは次のようなことを試してみます

SELECT max(date),name,matrix FROM report_data group by name

しかし、私はこれをテストしていません。

編集:

コメントディスカッションのサポートにより、私は次のような解決策を作成しました。

a = report_data.objects.values('name').annotate(latest=Max('creation_date'))

次に、すべての正しい作成日を取得しましたが、注釈付きオブジェクトを取得するにはどうすればよいですか?

EDIT2:

ここで、次のようなReportManagerを使用します。

class ReportManager(models.Manager):
    def recent(self):
        a = report_data.objects.values("name").annotate(latest_id=Max('id'))
        a = list(v['latest_id'] for v in a)
        return report_data.objects.filter(id__in=a).order_by('-creation_date')

しかし、私はこの解決策にあまり満足していません。実際の解決策を投稿していただきありがとうございます。

4

1 に答える 1

0

マックスをお探しですか?

from django.db.models import Max # also available: Q, Count, Min, Sum, Avg, StdDev, Variance, ...
report_data.objects.all().aggregate(Max('creation_date'))
于 2013-01-08T10:56:56.523 に答える