使用ManyToManyField重新组合列表

时间:2014-01-21 11:30:58

标签: django list manytomanyfield

我有ManyToManyField的模型:

class Action(models.Model):
    title = models.CharField('title', max_length=160)
    countries = models.ManyToManyField('Country', null=True, blank=True)

class Country(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=255, blank=True)

每个操作都有一个包含说明页面的网址。每个国家都有一个带旗帜的图标。行动可能有2个或更多国家。所以输出应该是这样的:

  1. 国家1,县2
    • 动作
    • 动作
    • 动作
  2. 国家3,国家4
    • 动作
  3. 国家1
    • 动作
    • 动作
  4. 国家3
    • 动作
  5. 我不知道如何解决这个问题。标记{%regroup%}无法正常工作,因为它仅在每个操作中按第一个国家/地区进行分组。

1 个答案:

答案 0 :(得分:0)

我认为您需要编写自己的重组算法。如果它在所有应用程序中只使用一次,您可以在视图中创建它:

regrouped = {}
actions = Action.objects.all()
# be careful this implementation creates large amount of sql queries.
# you need to optimize it or cache it!
for action in actions:
    country_key = '_'.join([country.pk for country in action.countries.all()])
    if not country_key in regrouped:
        regrouped[country_key] = {'countries': action.countries.all(), 'actions': []}
    regrouped[country_key]['actions'].append(action)

在模板中:

{% for key, item in regrouped.items %}
Countries: {% for country in item.countries %}{{ country }};{% endfor %}
Actions: {% for action in item.actions %}{{ action }};{% endfor %}
{% endfor %}