gpt4 book ai didi

Python3/Django - 查询集未更新

转载 作者:行者123 更新时间:2023-11-30 22:05:38 27 4
gpt4 key购买 nike

我正在创建一个允许创建事件的网站,这些事件将显示在主页和事件列表上,以便人们可以单击事件来查看它们的描述,以及在事件中签到。我在添加新事件时获取类中的查询集进行更新时遇到问题。

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

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)

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

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 类中设置的查询会自动更新,以便将其显示在此页面上。

任何帮助将不胜感激。

最佳答案

如果我们看一下 Django's source code for a 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):
<b>queryset = queryset.all()</b>
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 属性,例如:

class EventListView(generic.ListView):
model = Event
<b>queryset</b> = Event.objects.filter(
date__gte=today
).exclude(
approved=False
).order_by('date', 'time')[:21]
template_name = 'listPage.html'

或者,如果您确实想覆盖 get_queryset 函数,您可以使用:

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]

或者:

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

关于Python3/Django - 查询集未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52956384/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com