python Django:只显示与每个类别匹配并且至少有一个条目的模型条目

w41d8nur  于 2023-01-04  发布在  Python
关注(0)|答案(1)|浏览(113)

这是我创建的模型

class Jeu(models.Model):
    nom = models.CharField('Nom du jeu', max_length=100)
    logo = models.ImageField(blank=True)

    def courses_a_venir():
        return self.course_set.filter(date_evenement__gte = datetime.today()).order_by('date_evenement')

    def courses_passees():
        return self.course_set.filter(date_evenement__lt = 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")

以下是该视图:

def home(request):
    jeux = Jeu.objects.all()
    return render(
        request,
        'base_site/home.html',
        context={'title': 'Accueil',  'jeux': jeux,}
    )

下面是HTML代码:

{% for jeu in jeux %}
<h3>{{ jeu.nom }}</h3><br>
<div class="row row-cols-1 row-cols-md-3 g-4">
  {% for course in jeu.courses_a_venir %}
  <div class="col">
    <div class="card">
      <!--<img src="..." class="card-img-top" alt="...">-->
      <div class="card-body">
        <h5 class="card-title">{{ course.date_evenement }}</h5>
        <p class="card-text">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
      </div>
      <div class="card-footer">
        <small class="text-muted">{{ course.date_evenement }}</small>
      </div>
    </div>
  </div>
  {% endfor %}
</div><br>
{% endfor %}
<br><br>

问题是,一个“Jeu”可以被多个“Course”调用,因为它目前是在HTML代码中实现的,它会检索表“Jeu”中的所有“Jeu”和关联的“Course”,无论是否有一些“Jeu”不包含任何“Course”。
有人知道如何只显示包含至少一个“课程”的“Jeu”吗?

t3psigkw

t3psigkw1#

您可以使用course_set访问jeux链接到的所有课程。这适用于您的所有模型,您可以使用{model}_set或通过在ForeignKey上指定related_name来执行反向查找。
你可以在这里找到一个例子:https://docs.djangoproject.com/en/dev/topics/db/examples/many_to_one/
course_set是一个查询集,因此您可以正常地对它们使用allfilter ...操作。

jeux = Jeu.objects.all()
for jeu in jeux:
    if jeu.course_set.exists():
        # jeu has a course
    else:
        # jeu does not have a course

相关问题