首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python3 / Django - QuerySet不更新?

Python3 / Django - QuerySet不更新?
EN

Stack Overflow用户
提问于 2018-10-24 08:01:28
回答 1查看 0关注 0票数 0

我正在创建一个允许创建事件的网站,这些事件将显示在主页和事件列表中,以便人们可以点击事件查看它们的描述,以及在活动中办理登机手续。我有一个问题是在一个类中获取一个查询集以在添加新事件时更新。

所以这个功能是我们的主页。每次返回页面时,query_set都会更新,因此当添加新事件时,它会显示在此页面上。

代码语言:javascript
复制
def index(request):
    num_future_events = Event.objects.filter(date__gte=today).filter(approved=True).count()
    query_set = Event.objects.filter(date__gte=today).filter(approved=True).order_by('date', 'time')[:3]

    context = {
        'num_future_events': num_future_events,
        'query_set': query_set
    }

    return render(request, 'index.html', context=context)

这是我网站上的事件列表页面的类。它使用查询集但由于该类只被调用一次,因此查询集将仅在类的初始化时更新。

代码语言:javascript
复制
class EventListView(generic.ListView):
    model = Event
    query_set = Event.objects.filter(date__gte=today).exclude(approved=False).order_by('date', 'time')[:21]
    template_name = 'listPage.html'

    def get_queryset(self):
        return self.query_set

我希望得到一些帮助,因此当添加新事件时,EventListView类中的查询设置会自动更新,以便它将显示在此页面上。

任何帮助将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2018-10-24 17:07:17

如果我们看一下Django的源代码ListView,我们看到:

def get_queryset(self): """ Return the list of items for this view. The return value must be an iterable and may be an instance of `QuerySet` in which case `QuerySet` specific behavior will be enabled. """ if self.queryset is not None: queryset = self.queryset if isinstance(queryset, QuerySet): queryset = queryset.all() elif self.model is not None: queryset = self.model._default_manager.all() else: raise ImproperlyConfigured( "%(cls)s is missing a QuerySet. Define " "%(cls)s.model, %(cls)s.queryset, or override " "%(cls)s.get_queryset()." % { 'cls': self.__class__.__name__ } ) ordering = self.get_ordering() if ordering: if isinstance(ordering, str): ordering = (ordering,) queryset = queryset.order_by(*ordering) return queryset

因此,Django每次构造一个新的查询集,通过调用.all() 它来创建一个未经评估的查询集克隆,这样就不得不重新评估它。

在这种情况下,我因此建议你覆盖get_queryset,而只是使用queryset属性,如:

代码语言:javascript
复制
class EventListView(generic.ListView):
    model = Event
    queryset = Event.objects.filter(
        date__gte=today
    ).exclude(
        approved=False
    ).order_by('date', 'time')[:21]
    template_name = 'listPage.html'

或者如果你真的想要覆盖get_queryset你可以使用的功能:

代码语言:javascript
复制
class EventListView(generic.ListView):
    model = Event
    template_name = 'listPage.html'

    def get_queryset(self):
        return Event.objects.filter(
            date__gte=today
        ).exclude(approved=False).order_by('date', 'time')[:21]

要么:

代码语言:javascript
复制
class EventListView(generic.ListView):
    model = Event
    template_name = 'listPage.html'
    query_set = Event.objects.filter(
        date__gte=today
    ).exclude(approved=False).order_by('date', 'time')[:21]

    def get_queryset(self):
        return self.query_set.all()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100005098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档