You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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模型中定义的两个方法存在语法问题,会导致运行报错,需同步修正:

  1. 方法缺少self参数
  2. 需要导入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:20:22