3

次のようなカスタム モデル マネージャーがあります。

class MyManager(models.Manager)
    def get_query_set(self):
        '''Only get items that are 'approved' and have a `pub_date` that is in
        the past.  Ignore the rest.'''
        queryset = super(MyManager, self).get_query_set()
        queryset = queryset.filter(status__in=('a',))
        return queryset.filter(pub_date__lte=datetime.utcnow())

そして、これは十分に機能します。ただし、Djangoのgeneric.list_detailビューの使用に問題がobject_detailあり、クエリセットは1回object_listしかロードされていないようで、このため、本来あるべきアイテムをフェッチしていません。最初にロードされます)。utcnow()

これは意図的なものであり、パフォーマンスの向上を意図していると思いますが、ビューで使用できるようになる前に、サイトの他の場所 (ビューにない場所) にビデオが表示されることを意味します(以下のurls.py を参照)。これは 404 につながります...object_detailobject_detail

何か案は ?または、これを回避するために独自のカスタム ビューを作成する必要がありますか?

ありがとう!

urls.py

url(r'^video/(?P<object_id>\d+)$', 
    list_detail.object_detail,
    {   'queryset': Video.objects.all(), },
    name='video_detail',
),
4

3 に答える 3

4

これはキャッシュの問題ではありません。現在行っているように、クエリセットの定義は URL の解析中に一度評価され、その後は二度と評価されません。

解決策は実際には非常に単純で、オンラインドキュメントで説明されています。
私は実際に同様のソリューションをかなり多く使用しており、非常に快適に感じています.

ところで、ちょっとした補足ですが、この場合、カスタム マネージャーを使用せず、代わりに通常のフィルタリングに戻ることをお勧めします。

于 2009-12-07T00:33:43.203 に答える
2

urls.py を次のように修正してみてください。

url(r'^video/(?P<object_id>\d+)$', 
    list_detail.object_detail,
    {   'queryset': Video.objects.all, }, # here's the difference
    name='video_detail',
)

編集:

これが失敗した場合は、filter() に同様の手法 (呼び出す代わりに callable を渡す) を適用してみてください。

return queryset.filter(pub_date__lte=datetime.utcnow)
于 2009-12-06T22:29:06.810 に答える
1

私は thornomad とほぼ同じモデル Manager を持っており、ジェネリック ビューにも同じ問題があります。

上記の提案はどちらも機能しないことを指摘する必要があります。

  • 括弧なしで Video.objects.all を実行すると、エラーが発生します
  • queryset.filter(pub_date__lte=datetime.utcnow) を再度括弧なしで実行すると、エラーは発生しませんが、問題は解決しません

また、ラムダを使用してクエリセットを返す別の方法も試しました。

qs = lambda *x: Video.objects.all()
url(r'^video/(?P<object_id>\d+)$', 
    list_detail.object_detail,
    {   'queryset': qs(), },
    name='video_detail',
),

...それもうまくいきませんでした。

lazy_qs = lambda *x: lazy(Post.live_objects.all, QuerySet)

blog_posts = {
    'queryset': lazy_qs(),

...私が知る限り、utils.functional.lazyは結果をQuerySetに適切に変換する方法がわからないため、どちらも機能しません(エラーが発生します)。

一般的なビューをラップするというロベルトの答えが唯一の助けになると思います。

一般的なビューで使用されるクエリセットの制限を指摘するために、django ドキュメントを修正する必要があります (現在、ドキュメントには、すべてが問題ないことを示す特別な注意事項があります!)

于 2010-05-25T15:26:03.353 に答える