Skip to main content
 首页 » 编程设计

python之django之如何将表的记录与来自另一个表的计算计数值绑定(bind)

2025年04月02日42虾米哥

在我的应用程序中,我有一个培训列表。此列表中的一个字段应显示每个培训的预订数量。 为了说明我的意思,我准备了 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