1. ホーム
  2. django

[解決済み] DISTINCT ON フィールドは、このデータベースバックエンドではサポートされていません。

2022-02-18 22:09:05

質問

最新の値を取得するためにdistinctを使用していますが、エラーが発生します。

DISTINCT ON fields は、このデータベースバックエンドではサポートされていません。

views.py

class ReportView(LoginRequiredMixin, generic.TemplateView):
    template_name = 'admin/clock/report.html'

    def get_context_data(self, **kwargs):
        context = super(ReportView, self).get_context_data(**kwargs)
        context['reports'] =  TimesheetEntry.objects.filter(
                                  timesheet_jobs__job_company = self.request.user.userprofile.user_company,
                              ).distinct('timesheet_users')
        return context

基本的に、私は TimesheetEntry のエントリが多数存在するようなモデルで user の外部キーである User を内蔵したモデルです。

そこで、ユーザーを指定してクエリを実行し、そのユーザーの最新のエントリを表示させたいと思います。ユーザーの最新のエントリを取得することは、私にとって非常に重要です。

models.py

class TimesheetEntry(models.Model):
    timesheet_users = models.ForeignKey(User, on_delete=models.CASCADE,related_name='timesheet_users')
    timesheet_jobs = models.ForeignKey(Jobs, on_delete=models.CASCADE,related_name='timesheet_jobs')
    timesheet_clock_in_date = models.DateField()
    timesheet_clock_in_time = models.TimeField()

解決方法は?

distinct('field_name') は MySQL でサポートされていません。サポートされるのは distinct() . distinct('field_name') でしか動作しません。 PostgresSQL . 詳しくは ドキュメント .

例(1番目以降はPostgreSQLでのみ動作します)。 ( ドキュメントからコピーペーストしたものです。 )

>>> Author.objects.distinct() 
   [...]

>>> Entry.objects.order_by('pub_date').distinct('pub_date')
   [...]

>>> Entry.objects.order_by('blog').distinct('blog')
   [...]

>>> Entry.objects.order_by('author', 'pub_date').distinct('author', 'pub_date')
   [...]

>>> Entry.objects.order_by('blog__name', 'mod_date').distinct('blog__name', 'mod_date')
   [...]

>>> Entry.objects.order_by('author', 'pub_date').distinct('author')
   [...]