我将简要解释我要做什么。
用户将使用email
,first and last name
进行注册,然后选择一个city
(由称为Waitlist
的模型处理)。
我正在使用django_cities_light
进行城市选择。
我想定义一个queryset
来计算选择特定城市的次数,然后将该数字输出到我的template_name
页面上。
例如)3个用户注册,2个用户选择London
作为他们的城市,因此在我的London
模型中有2个Waitlist
城市对象的实例。我希望能够轻松地在多个城市做到这一点。
我想例如使用2
渲染此{{ for London in waitlist.qs }}
(我不确定语法,因此不知道为什么问)。
我将展示到目前为止的工作,如果有人可以向我解释如何正确定义查询集,我将不胜感激!
views.py
class HomeView(TemplateView):
template_name = 'home/home.html'
def get(self, request, *args, **kwargs):
london = Waitlist.objects.get(??)
context = {
'london': london,
}
return render(request, self.template_name, context)
models.py
class Waitlist(models.Model):
first_name = models.CharField(max_length=30, null=True)
last_name = models.CharField(max_length=30, null=True)
email = models.CharField(max_length=40, null=True)
city = models.ForeignKey(City, null=True, blank=True, on_delete=models.CASCADE)
最佳答案
可能您需要这样的东西,获取所有城市并准备数据:
class HomeView(TemplateView):
template_name = 'home/home.html'
def get(self, request, *args, **kwargs):
query = Waitlist.objects.all()
data = {}
for cname in query.values('city__name').distinct():
city = cname['city__name']
data[city] = query.filter(city__name=city)
context = {
'data': data,
}
return render(request, self.template_name, context)
并在模板中
{% for city, details in data.items %}
<strong>{{ city }}, total - {{ details|length }}:<strong>
<ul>
{% for wait_item in details %}
<li>{{ wait_item.first_name }} - {{ wait_item.email }}</li>
{% endfor %}
</ul>
<hr>
{% endfor %}
如果只需要
London
认为应该是:
class HomeView(TemplateView):
template_name = 'home/home.html'
def get(self, request, *args, **kwargs):
data = Waitlist.objects.filter(city__name__iexact='london')
context = {
'data': data,
}
return render(request, self.template_name, context)
并在模板中:
<strong>London, total - {{ data|length }}:<strong>
<ul>
{% for wait_item in data %}
<li>{{ wait_item.first_name }} - {{ wait_item.email }}</li>
{% endfor %}
</ul>
您可以阅读iexact,distinct的查询的详细信息
关于python - 计算模型语法中City对象的实例数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55326302/