计算模型语法中City对象的实例数

时间:2019-03-24 17:04:59

标签: python django

我将简要解释我要做什么。

用户将使用emailfirst and last name进行注册,然后选择一个city(由称为Waitlist的模型处理)。

我正在使用django_cities_light进行城市选择。

我想定义一个queryset来统计选择一个特定城市的次数,然后将该数字输出到我的template_name页面上。

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

1 个答案:

答案 0 :(得分:1)

也许您需要这样的东西,获取所有城市并准备数据:

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>

有关查询的详细信息,您可以阅读iexactdistinct