2017-03-27 8 views
0

私は幾分複雑なモデルを持っていますので、私は現在の状態と必要を簡略化する例を与えるために全力を尽くします。Django Instanceの他のフィールドに 'when'を使用してmany-2-manyフィールドの単一インスタンスを注釈します

qs = MyModel.objects.all() 

このクエリセット内の各インスタンス、別のモデルには多くの-2-多くのフィールドを持っている、のは「First_M2M」と呼んでみましょう:

私はクエリセットを持っています。 First_M2Mが別のモデルへの外部キーを有し、(それぞれFkModelとSecond_M2M)さらに別のモデルに多く-2-多く:

qs[0].first_m2m.fk_model.name # This is a string. 
qs[0].first_m2m.second_m2m.all() # This is a many2many manager. 

Second_M2Mは別の多く-2-多くの関係を有する、Third_M2M:

qs[0].first_m2m.second_m2m[0].third_m2m.all() # Also a m2m manager. 

これは私がやろうとしていることです:second_m2mインスタンスのいずれかの値に基づいてqを注文したいと思います。しかし、どのインスタンスを選択する必要があります。これは、first_m2mインスタンスを決定するためにfk_modelのフィールドを照会し、third_m2m内のインスタンスの1つのフィールドを照会することによって行われます(これによってsecond_m2mが決定されます)。

これをさらに興味深くするために、注文する値はYAMLです。

は、ここで私が何しようとしたものです:

qs.annotate(val_to_filter_by=Case(
           When(
           first_m2m__fk_model__name='foo', 
           first_m2m__second_m2m__third_m2m__some_field='bar'), 
           then='first_m2m__second_m2m__value_field', 
           default=Value(None), 
           output_field=YAMLField() 
          ) 
          ).order_by(val_to_filter) 

私は私が間違って得たものを信じているが、Djangoはそれが取るべきどのインスタンスかを決定するための十分なコヒーレントではありません、クエリです。しかし、私は私の問題を見つけることができません。

ご協力いただければ幸いです。

答えて

0

解決済み...

私は自分のミスをしていました。それは、「いつ」の代わりに私の「ケース」の一部でした。ここでは解決策は以下のとおりです。

qs.annotate(val_to_filter=Case(
          When(
           first_m2m__fk_model__name='foo', 
           first_m2m__second_m2m__third_m2m__some_field='bar', 
           then=F('first_m2m__second_m2m__value_field') 
           ), 
           default=Value(''), 
           output_field=YAMLField() 
           )).order_by(val_to_filter) 

UPDATE:私は右のクエリを得たが、

...それを解決しませんでした、そしてそれは、私が代わりに、second_m2mのすべてのインスタンスを取得しています働いていました単一のインスタンス。私が必要とするものを正確に得る方法がまだ分かりませんが、Djangoはこの場合、私の友人ではないようです。

アップデート2: は、 'デフォルト=なし' に変更しないと右の発注前に

.exclude(val_to_filter=None) 

を追加しました。仕事をしているようだ...

関連する問題