代码之家  ›  专栏  ›  技术社区  ›  thornomad

Django的列表\u详细信息视图是否将查询集保存到内存(不更新)?

  •  3
  • thornomad  · 技术社区  · 15 年前

    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 object_list :查询集似乎仅在加载 一旦 utcnow() 时间只被调用过一次(当它第一次加载时)。

    我认为这是有意的,是为了提高性能——然而,这意味着视频会出现在网站的其他地方(在我所在的地方) 对象详细信息 查看(请参阅下面的url.py)。这导致了404。。。

    有什么想法吗?或者我必须编写自己的自定义视图来避免这种情况?

    谢谢!

    网址.py

    url(r'^video/(?P<object_id>\d+)$', 
        list_detail.object_detail,
        {   'queryset': Video.objects.all(), },
        name='video_detail',
    ),
    
    3 回复  |  直到 4 年前
        1
  •  4
  •   rob    15 年前

    这不是缓存的问题:正如您现在所做的,queryset 定义 在解析URL时计算一次,然后再也不会计算。

    Complex filtering with wrapper functions :只需创建一个小的自定义视图,它将简单地调用通用视图。
    实际上,我经常使用类似的解决方案,我觉得很舒服。

    顺便说一句,对于这种情况,我建议不要使用自定义管理器,而是使用常规的过滤。

        2
  •  2
  •   gorsky    15 年前

    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)
    
        3
  •  1
  •   Anentropic    14 年前

    我的模型管理器与thornomad几乎相同,通用视图也有同样的问题。

    • 如果不使用括号执行Video.objects.all,则会出现错误
    • 执行queryset.filter(pub\u date\u lte=datetime.utcnow),同样不带括号,不会给出错误,但不会解决问题

    我还尝试了另一种方法,即使用lambda返回queryset,例如:

    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(),
    

    我认为Roberto包装泛型视图的答案是唯一有用的。