如何在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
相关产品推荐
相关产品推荐

