使用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)

每个动作都有一个带有描述的页面的URL。每个国家都有一个带有国旗的图标。行动可能有2个或更多国家。因此输出应该是这样的:

  1. 国家1,县2
    • 动作
    • 动作
    • 动作
  2. 国家3,国家4
    • 动作
  3. 国家1
    • 动作
    • 动作
  4. 国家3
    • 动作

我不知道如何解决问题。标签{%regroup%}无法正常工作,因为它仅在每个动作中按第一个国家组成。

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

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

相关内容

  • 没有找到相关文章

最新更新