在 Django 模板的 if 条件中使用外键值

using Foreign Key value in if condition in Django Template

我有一个模型,其中有一个外键。像这样:

class Chart(models.Model):
     titleFA     = models.CharField(max_length=200)
     titleEN     = models.CharField(max_length=200)
     category = models.ForeignKey(Category, on_delete=models.PROTECT, blank=True)

与此模型相关的类别:

class Category(models.Model):
     nameEN = models.CharField(max_length=200, default="")

这是视图文件:

def drawcharthome(request):
   allcharts = Chart.objects.all()
   allcats = Category.objects.all()
   return render(request, 'charts/drawcharthome.html',{'allcharts': allcharts,'allcats':allcats})

我需要检查模板中两个参数的相等性:

{% for  cat in allcats %}
   {% for  chart in allcharts %}
      {% if chart.category == cat.nameEN %}
        <li>
          <a href="{{ chart.api_url }}"> {{ chart.titleFA }}</a>
        </li>
      {% endif %}
   {% endfor %}
{% endfor %}

但是我内心的if不行!

您可以使用 my_category.chart_set 访问 Category 对象的相关 Chart,因此您可以通过以下方式实现:

def drawcharthome(request):
    allcats = Category.objects<strong>.prefetch_related('chart_set')</strong>
    return render(request, 'charts/drawcharthome.html',{'allcats':allcats})

并在模板中渲染:

{% for cat in allcats %}
    {% for chart in cat<strong>.chart_set.all</strong> %}
         <li>
             <a href="{{ chart.api_url }}"> {{ chart.titleFA }}</a>
          </li>
    {% endfor %}
{% endfor %}

.prefetch_related(…) [Django-doc] 不是必需的,但它会用一个查询加载所有相关的 Chart 并在 Django/Python 层中进行连接,这将导致两个查询而不是 N+1,您在其中进行一次查询以获取 Categorys,而 N 查询每次获取相关chart_set 个类别。