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

如何在Django中展示激活状态的饮品及其关联配料?

解决方法

直接在模板中反向查询关联配料

因为EventIngredient和EventDrink是多对多关联,Django会自动为EventDrink生成反向关联管理器,默认名称是eventingredient_set。你可以直接在模板中通过这个管理器获取当前饮品对应的所有配料:

视图代码(基础写法+优化写法)

# 基础写法:仅过滤激活的饮品,未优化关联查询
drinks = EventDrink.objects.filter(drink_active=True)

# 优化写法:用prefetch_related提前加载所有关联配料,避免N+1查询问题
drinks = EventDrink.objects.filter(drink_active=True).prefetch_related('eventingredient_set')

模板代码示例

{% for drink in drinks %}
  <h3>{{ drink.name }}</h3>
  <p>关联配料:</p>
  <ul>
    {% for ingredient in drink.eventingredient_set.all %}
      <li>{{ ingredient.name }} - <a href="{{ ingredient.url }}">查看详情</a></li>
    {% empty %}
      <li>无关联配料</li>
    {% endfor %}
  </ul>
{% endfor %}

自定义反向关联名称(更直观)

如果你觉得eventingredient_set不够好记,可以在EventIngredient的多对多字段中添加related_name参数,自定义反向关联的名称:

修改模型代码

class EventIngredient(models.Model):
    # 添加related_name自定义反向关联名称
    drink = models.ManyToManyField(EventDrink, related_name='ingredients')
    name = models.CharField(max_length=255)
    url = models.URLField()

    def __str__(self):
        return self.name

对应修改视图和模板

# 视图中用自定义的related_name做预加载
drinks = EventDrink.objects.filter(drink_active=True).prefetch_related('ingredients')
{% for drink in drinks %}
  <h3>{{ drink.name }}</h3>
  <p>关联配料:</p>
  <ul>
    {% for ingredient in drink.ingredients.all %}
      <li>{{ ingredient.name }} - <a href="{{ ingredient.url }}">查看详情</a></li>
    {% empty %}
      <li>无关联配料</li>
    {% endfor %}
  </ul>
{% endfor %}

内容的提问来源于stack exchange,提问作者Thomas Doll-Datema

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 23:07:05