3

Readモデルに関連するモデルがありますArticle。私がやりたいのは、記事が一意で、順序付けされたクエリセットを作成することdate_addedです。私はpostgresを使用しているので、.distinct()メソッドを使用してarticleフィールドを指定したいと思います。そのようです:

articles = Read.objects.order_by('article', 'date_added').distinct('article')

ただし、これでは目的の効果が得られず、クエリセットが作成された順序で並べ替えられます。私は Django のドキュメントに関する注意事項を認識して.distinct().order_by()ますが、それが言及されている副作用は重複があり、それが表示されないため、ここに適用されるとは思いません。

# To actually sort by date added I end up doing this
articles = sorted(articles, key=lambda x: x.date_added, reverse=True)

これにより、実際に必要になる前にクエリ全体が実行され、多数のレコードがある場合は非常に遅くなる可能性があります。を使用して既に最適化しselect_related()ました。

関連モデルの一意性と order_by 日付を使用してクエリを作成する、より効率的で効率的な方法はありますか?

更新 出力は、関連する記事がクエリセット内で一意であり、Django orm (つまり、python での並べ替え) のみを使用する Read インスタンスのクエリセットであることが理想的です。

4

1 に答える 1

2

関連モデルの一意性と order_by 日付を使用してクエリを作成する、より効率的で効率的な方法はありますか?

おそらく。全体像なしで言うのは難しいですが、私の推測では、Readどの記事が読まれたか、読まれていないかを追跡するために を使用しており、おそらくこれをUserインスタンスに結び付けて、特定のユーザーが記事を読んだかどうかを判断していると思います。その場合、あなたのアプローチには欠陥があります。代わりに、次のようにする必要があります。

class Article(models.Model):
    ...
    read_by = models.ManyToManyField(User, related_name='read_articles')

次に、特定のユーザーが読んだ記事を取得するには、次のようにします。

user_instance.read_articles.order_by('date_added')

distinct重複がなくなるため、式から使用する必要がなくなります。

アップデート

少なくとも 1 人のユーザーが読んだすべての記事を取得するには:

Article.objects.filter(read_by__isnull=False)

または、人気のしきい値を設定する場合は、注釈を使用できます。

from django.db.models import Count

Article.objects.annotate(read_count=Count('read_by')).filter(read_count__gte=10)

これにより、少なくとも 10 人のユーザーが読んだ記事のみが表示されます。

于 2012-06-27T16:19:34.590 に答える