如何在Django中仅显示关联至少一个Course的Jeu实例?
解决Django中仅显示关联至少一个Course的Jeu实例问题
核心解决方案:数据库层面过滤关联实例
直接在视图中修改查询集,只保留关联了至少一个Course的Jeu对象,有两种高效的实现方式:
方式一:通过外键非空条件过滤
利用外键的isnull属性排除无关联的实例,配合distinct()避免重复结果(一个Jeu可能对应多个Course):
def home(request): # 仅保留关联至少一个Course的Jeu实例 jeux = Jeu.objects.filter(course__isnull=False).distinct() return render( request, 'base_site/home.html', context={'title': 'Accueil', 'jeux': jeux,} )
方式二:通过注解统计关联数量过滤
使用annotate统计每个Jeu关联的Course数量,再筛选数量大于0的实例:
from django.db.models import Count def home(request): jeux = Jeu.objects.annotate(course_count=Count('course')).filter(course_count__gt=0) return render( request, 'base_site/home.html', context={'title': 'Accueil', 'jeux': jeux,} )
额外修复:模型方法的语法错误
你的Jeu模型中定义的两个方法存在语法问题,会导致运行报错,需同步修正:
- 方法缺少
self参数 - 需要导入
datetime模块
修正后的模型代码:
import datetime from django.db import models class Jeu(models.Model): nom = models.CharField('Nom du jeu', max_length=100) logo = models.ImageField(blank=True) def courses_a_venir(self): return self.course_set.filter(date_evenement__gte=datetime.datetime.today()).order_by('date_evenement') def courses_passees(self): return self.course_set.filter(date_evenement__lt=datetime.datetime.today()).order_by('-date_evenement')[:3] class Course(models.Model): jeu = models.ForeignKey(Jeu, verbose_name='Nom du jeu', on_delete=models.CASCADE) ligue = models.ForeignKey(Ligue, on_delete=models.CASCADE) circuit = models.ForeignKey(Circuit, on_delete=models.CASCADE) date_evenement = models.DateTimeField("Date de la course")
不推荐的模板层面过滤
虽然可以在模板中通过{% if jeu.course_set.exists %}判断后再渲染,但这种方式会先查询所有Jeu实例,再在模板中过滤,效率远低于数据库层面的过滤,因此不建议使用。
内容的提问来源于stack exchange,提问作者Madal
相关产品推荐
相关产品推荐

