naetoru2144
@naetoru2144

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Django 多対多関連させて記事に付けたタグの表示順を並べ替えたい

解決したいこと

DjangoとSQLiteでWebアプリを作っています
多対多関連させて記事に付けたタグの表示順を並べ替えたいのですが、方法が分かりません…
以下に詳細を記しますので、ご教示いただけないでしょうか(>人<;)

###実際の表示
スクリーンショット 2021-11-19 15.42.37.png
このようにライバー(画像では桐生ココ)に紐付けたタグをforループで表示しています
これをタグクラス(下に画像アリ)に与えたpriorityという変数順に並べたいです

対象のhtml

<table>
  {% for liver in data %}
  <tr>
    <td class="liver-data">
      <ul>
        <li class="tags">
          {% for TAG in liver.tags.all %}
          <div class="tag">
            {{TAG.tag}}
          </div>
          {% endfor %}
        </li>
      </ul>
    </td>
  </tr>
  {% endfor %}
</table>

※ dataにはliverモデルのレコードのリストが入っています

###liverモデルのレコードの例(admin)
スクリーンショット 2021-11-19 15.45.19.png
このようにManytoManyFieldでライバーごとにタグを紐付けています

###Tagsモデル
スクリーンショット 2021-11-19 15.41.41.png
このようにPriorityという要素を設定しています

自分で試したこと

liver.tags.all.order_by("priority")
↑viewsに書くと動くコードをテンプレートタグ内に書いてみた 結果:構文エラー

0

1Answer

モデル class にソート済みタグ一覧のプロパティを定義しておく方法が1つあるかなと思いました

models.py
class Liver(models.Model):
    ...
    @property
    def ordered_tags(self):
        return self.tags.all().order_by('priority')
liver.html
...
        <li class="tags">
          {% for TAG in liver.ordered_tags %}
          <div class="tag">
            {{TAG.tag}}
          </div>
          {% endfor %}
        </li>
...

あと、上記では liver ごとの for 文でDBクエリが発行される いわゆる N+1 問題が発生しているため、少し工夫の余地があると思います。

1Like

Comments

  1. @naetoru2144

    Questioner

    ありがとうございます、シンプルに問題が解決する方法でめっちゃありがたいです😻
    (Taggitも調べたら出てきたんですけどなんか複雑そうでやめちゃったんですよね…😉)
    N+1問題は初心者で存じ上げなかったのですが調べて対応しようと思います、ありがとうございます🙏🙏

Your answer might help someone💌