すでに多くの同様の質問がなされていると思いますが、コピー&ペーストの解決策を作ることができませんでした。だからここに問題があります:
レポート用にユーザーデータの分析を定期的に計算します。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')
しかし、私はこの解決策にあまり満足していません。実際の解決策を投稿していただきありがとうございます。