0

私を悩ませている Django ORM の問題で立ち往生しています。外部キーでリンクされた一連のモデルがありますが、要件が少し奇妙です。リレーションのリレーションごとにアイテムをリストする必要があります。これを説明するのは難しいので、これを以下に示してみました。

仕事

  • ManyToMany(受賞)

アワード

  • ForeignKey(受賞カテゴリー)

賞の種類

賞のカテゴリ別にリストされるように、作業項目をリストする必要があります。望ましい出力は次のようになります。

作業インスタンス A

  • 助成カテゴリ インスタンス A に属する助成インスタンス A
  • 助成カテゴリ インスタンス A に属する助成インスタンス C
  • 助成カテゴリ インスタンス A に属する助成インスタンス G

作業インスタンス A (上記と同じインスタンスですが、別の award__category でリストされています)

  • 特典カテゴリ インスタンス B に属する特典インスタンス F
  • 落札カテゴリ インスタンス B に属する落札インスタンス R
  • 助成カテゴリ インスタンス B に属する助成インスタンス Z

作業インスタンス B

  • 助成カテゴリ インスタンス A に属する助成インスタンス B
  • 助成カテゴリ インスタンス A に属する助成インスタンス A

基本的に、すべての作品を賞のカテゴリ別にリストしたいと思います。これを部分的に機能させることはできますが、私の解決策は不潔でひどいものです。もっと良い方法はないかと考えています。ManyToMany と through 属性の使用を検討しましたが、正しく使用されているかどうかわかりません。

4

2 に答える 2

1

モデルのフィールドとリレーションに従って、以下を調整します。

for w in Work.objects.all():
    print w
    for award in w.award_set.order_by(awardcategory):
         print "%s that belongs to %s" % (award,award.awardcategory)
于 2012-09-13T21:35:19.083 に答える
0

だから私は同様の結果を思いついたが、それでも少し汚れているように感じる:(

categories = AwardCategory.objects.all()
work = []
for cat in categories:
    work_in_cat = Work.objects.filter(awards__category=cat).distinct()
    for w in work_in_cat:
        work.append({
            'work': w,
            'category': cat,
            'awards': w.awards.filter(category=cat)
        })

これは私が望む結果を生成しますが、これを for ループで行うのは間違っているようです!

于 2012-09-15T15:18:09.653 に答える