2

したがって、次のようなモデルがあります。

class Names(models.Model):
  name = models.CharField()

class Entries(models.Model):
  name = models.ForeignKey(Names)
  date = models.DateField()

データはこんな感じ

name   |  date

name_1 |  2011-06-01
name_2 |  2011-03-01
name_3 |  2011-02-01
name_1 |  2010-06-01
name_2 |  2010-03-02
name_3 |  2010-02-01
name_4 |  2009-07-01

日付でエントリをクエリし、日付以下の各名前レコードを1 回取得したいと考えています。したがって、日付​​2011-06-01でクエリを実行すると、これが返されます。

name_1 | 2011-06-01
name_2 | 2011-03-01
name_3 | 2011-02-01
name_4 | 2009-07-01

私の仮定は、これがうまくいくということです:

date = datetime(year=2011, month=06, day=01)
results = Entries.objects.filter(date__lte=date).order_by('date').distinct('name')

しかし、私はそこに重複した名前のエントリを取得し続けます。

ヒントはありますか?

編集: ソリューションは Gareth Rees によって提供されました。少し修正する必要がありましたが、次のようになります。

sql = """myapp_entries.id = (SELECT E.id from myapp_entries AS E
                             WHERE E.name_id = myapp_names.id AND
                             '"""+date.strftime('%Y-%m-%d')+"""'
                             ORDER BY E.date DESC
                             LIMIT 1)'''

results = (Entries.objects
           .extra(where = [sql])
           .filter(date__lte = date)
           .order_by('name', 'date'))
4

3 に答える 3

1

結果の必要性に応じて、いくつかのアプローチを次に示します。

Entries(1) 結果を (オブジェクトではなく) 辞書形式で取得してもかまわない場合は、annotate組み合わせて使用​​しvaluesて結果をグループ化できます。この場合、必要なクエリは次のようになります。

from django.db.models import Min
results = (Entries.objects
           .filter(date__lte = date)
           .values('name')
           .annotate(date = Min('date'))
           .order_by('name', 'date'))

Entries(2) 結果をオブジェクトとして戻す必要がある場合extraは、同じ名前のすべてのエントリの中で最も古いエントリのみを選択するために使用できます。

sql = '''id = (SELECT E.id FROM myapp_entries AS E
                WHERE E.name_id = myapp_entries.name_id
                ORDER BY E.date
                LIMIT 1)'''
results = (Entries.objects
           .extra(where = [sql])
           .filter(date__lte = date)
           .order_by('name', 'date'))
于 2012-04-21T13:49:59.667 に答える
0

外部キーをトラバースしたいので、.distinct('name__name')を使用してみてください。

于 2012-04-21T08:00:48.563 に答える
0

おそらくドキュメントを読む必要があります: https://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct

.distinct(*fields) は postgres でのみ機能し、.order_by と .distinct を一致させる必要があります。例:

results = Entries.objects.filter(date__lte=date).order_by('date').distinct('date')

したがって、あなたの場合、おそらく次のようなものです。

results = Entries.objects.filter(date__lte=date).order_by('name', 'date').distinct('name')
于 2012-04-21T08:17:06.790 に答える