在我的应用程序中,我有一个培训列表。此列表中的一个字段应显示每个培训的预订数量。为了说明我的意思,我准备了 SQL 查询:
SELECT *
FROM club_training a
LEFT JOIN
(SELECT training_id, count(*)
FROM club_booking
group by training_id) b
ON a.id = b.training_id
你能给我一些建议如何在 Django 中做到这一点吗?我在我的代码中使用了 Booking.objects.all().values('training_id').annotate(booked_amount=Count('training_id'))
,但结果是所有训练的所有计数值为列表中的每个训练显示。应显示一个适合每次训练的计数值。
View .py
class HomePageView(TemplateView):
"""Home Page with list of trainings"""
template_name = 'club/training_list.html'
def get_context_data(self, **kwargs):
now = datetime.datetime.now()
context = super(HomePageView, self).get_context_data(**kwargs)
context['trainings'] = Training.objects.filter(state="A", training_date__gte=now).order_by('training_date', 'start_time')
for each_training in context['trainings']:
each_training.diff = each_training.availability - each_training.counter
each_training.counter = Booking.objects.all().values('training_id').annotate(booked_amount=Count('training_id'))
return context
模型.py
class Training(models.Model):
"""Class for plan training"""
STATE = (
('A', 'Active'),
('I', 'Inactive'),
)
name = models.ForeignKey('TrnDesc')
instructor = models.ForeignKey('Instructor')
start_time = models.TimeField(blank=True)
end_time = models.TimeField(default='00:00:00')
availability = models.PositiveIntegerField(default=15)
state = models.CharField(max_length=1, choices=STATE, default='A')
training_date = models.DateField(default=date.today)
counter = models.PositiveIntegerField(default=0)
def __str__(self):
return self.name.name
class Booking(models.Model):
"""Data of people which book fitness classes"""
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
email = models.CharField(max_length=50)
phone = models.CharField(max_length=10)
training = models.ForeignKey('Training')
def __str__(self):
return self.training.name.name
training_list.html
{% extends 'club/base.html' %}
{% block content %}
<ul class="nav nav-pills">
<li role="presentation" class="active"><a href="#">Fitness Classes</a></li>
<li role="presentation"><a href="#">Join Us</a></li>
<li role="presentation"><a href="#">Contact Us</a></li>
</ul>
<br></br>
{% regroup trainings by training_date as date_list %}
{% for date in date_list %}
<div class="panel panel-default">
<div class="panel-heading">{{date.grouper|date:"l, d F o"}}</div>
<table class="table">
<tr>
<th style="width: 20%">Training name</th>
<th style="width: 30%">Training description</th>
<th style="width: 10%">Instructor</th>
<th style="width: 10%">Start time</th>
<th style="width: 10%">End time</th>
<th style="width: 10%">Left</th>
<th style="width: 10%">Test_counter</th>
<th style="width: 10%">Actions</th>
</tr>
{% for training in date.list %}
<tr>
<td>{{training.name}}</td>
<td>{{training.name.desc}}</td>
<td>{{training.instructor}}</td>
<td>{{training.start_time|time:"H:i"}}</td>
<td>{{training.end_time|time:"H:i"}}</td>
<td>{{training.diff}}</td>
<td>{{training.counter}}</td>
<td><a href="{% url 'book' training_id=training.pk%}"><button type="button" class="btn btn-primary">Book</button></a></td>
</tr>
{% endfor %}
</table>
</div>
{% endfor %}
{% endblock %}
for each_training in context['trainings']:
each_training.diff = each_training.availability - each_training.counter
each_training.counter = Booking.objects.filter(training_id=each_training.id).count() # just modify this line
return context
我是一名优秀的程序员,十分优秀!