0

私はこのようなモデルを持っています:

from django.core import meta

class Foo(models.Model):
    date = models.DateTimeField()
    name = models.CharField(maxlength=100)

    def __unicode__(self):
        return self.name

    class Meta:
        get_latest_by = 'date'

そして私は書くことができます

>>> from datetime import datetime
>>> a1 = Foo(name='a1', date=datetime(2012, 12, 18))
>>> a1.save()
>>> a2 = Foo(name='a2', date=datetime(2012, 12, 19))
>>> a2.save()
>>> a3 = Foo(name='a3', date=datetime(2012, 12, 20))
>>> a3.save()
>>> a4 = Foo(name='a4', date=datetime(2012, 12, 21))
>>> a4.save()

次に書くと次​​のような結果になります

>>> Foo.objects.latest()
a4

最後の3つのオブジェクトをどのように取得しますか?何かのようなもの

>>> Foo.objects.latest(count=3)
a4, a3, a2

:並べ替えを使用する必要はありません。

>>> Foo.objects.all().order_by('-date')

日付ベースが非常に大きく、クエリに時間がかかるためです。

4

1 に答える 1

3

latest()は単なるショートカットなorder_by(model._meta.get_latest_by)ので、使用するとすでに並べ替えが行われます。他に方法はありません。使用する必要があります

Foo.objects.order_by('-date')[:3]

クエリが遅すぎる場合は、日付フィールドにインデックスを追加するか、id代わりにフィールドを使用するかを選択できます(自動IDを使用している場合)。

Foo.objects.order_by('-id')[:3]

クエリセットはスライス操作をオーバーロードするため、これは...LIMIT 3すべてのレコードを選択してからアプリケーション側で最初の3つを取得するのではなく、SQLでに変換されることに注意してください。

于 2012-12-18T06:54:32.537 に答える