首页 > 解决方案 > 在Django模板中的if条件中使用外键值

问题描述

我有一个模型,里面有一个外键。像这样:

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 %}

但我的内心如果不工作!

标签: djangodjango-modelsdjango-viewsdjango-templates

解决方案


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

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

并在模板中渲染它:

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

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


推荐阅读