2011-07-21 14 views
4

私はCoconutからSwallowへのForeignKeyを持っているとしましょう(つまり、ツバメは多くのココナッツを持っていましたが、それぞれのココナッツは1つのツバメだけ持っていました)。では、husk_segmentからCoconutにForeignKeyを持っているとしましょう。すべての関連オブジェクトに一致するDjangoクエリーセット

今、私はhusk_segmentsのリストを持っており、これらのすべてが特定の嚥下によって握られているかどうかを知りたいと思います。

swallow.objects.filter(coconuts_carried__husk_sements__in = husk_segment_list)を使用して、このスワローがリスト内の少なくとも1つの殻セグメントを把握していることを示すことができます。さて、どのように私は嚥下が運んできたすべての殻セグメントがこのリストにあることを示すことができますか?

+0

あなたがモデルの基本構造を追加した場合、それは物事の構造を理解しやすいかもしれません。 – niklasdstrom

答えて

2

私はこのツバメは、リスト内の少なくとも1つの 殻セグメントを把持したことを示すためにswallow.objects.filter(coconuts_carried__husk_sements__in = husk_segment_list)を有することができます。

いいえ、これは間違っている、これはあなたに* husk_segment_list *からの少なくとも一つの殻セグメントを実施しているツバメのリストを与えます。

私が正しいことを理解していれば、特定の嚥下を確認することを話しています。

class Swallow(models.Model): 
    name = models.CharField(max_length=100) 


class Coconut(models.Model): 
    swallow = models.ForeignKey(Swallow, related_name='coconuts_carried') 



class HuskSegment(models.Model): 
    coconut = models.ForeignKey(Coconut, related_name='husk_segments') 

あなたはすでにあなたがツバメセグメントagaintsチェックする必要が殻セグメントリストを持っている場合、あなたはそれを解決する必要がない理由はありません。

だから、あなたの説明から私はあなたのモデルがこのような何かを見て推測しますクエリでスワローのセグメントを取得し、それがあなたの殻セグメントリストのスーパーセットであるかどうかを確認します。

だから我々は持っている:

#husk_segment_list = [<object: HuskSegment>, <object: HuskSegment>, <object: HuskSegment>...] 
husk_segments_set = set((husk.pk for husk in husk_segment_list)) 

whitey = Swallow.object.get(name='Neochelidon tibialis') 
wh_segments_set = set((value[0] for value in HuskSegment.objects.filter(coconut__in=whitey.coconuts_carried.all()).values_list('id'))) 

whitey_has_carried_all = wh_segments_set.issuperset(husk_segments_set) 
2

the docs on queries spanning multi-valued relationshipsを参照してください。フィルタ呼び出しをチェーンする必要があります。どこへ行く

簡単な方法は、私が正しく変更された質問を理解している場合、あなたがする必要がありますreduceを使用して1行でこれを行うには空想の方法は

reduce(lambda q, c: q.filter(coconuts_carried=c), coconuts, Swallow.objects.all()) 
+0

私はそれについて考えました(ループではなく、縮小/ labda)が、それは特にエレガントではありません、それですか? ANDを使ってQオブジェクトをループするのはどうですか?あなたはこの解決策よりも良いか悪いとランク付けしていますか? – jMyles

+0

私は、私が質問を誤解したことに気づきました:実際には、嚥下によって運ばれたすべてのココナッツがリストに入っていることを確認する必要があります。リストのすべてのココナッツが嚥下によって運ばれたわけではありません。 – jMyles

0

だろう

queryset = Swallow.objects.all() 
for coconut in coconuts: 
    queryset = queryset.filter(coconuts_carried=coconut) 

ようなものになるだろう飲み物のcoconut_carried_setと運ばれたココナッツのリストとを比較することができる。私はあなたが事前にチェックしたいか、あなたはすべてのツバメに対してそれを確認したい場合はどの飲み込む知っていれば、それが依存すると思います - -

は、私はこれがあなたが望むものであることを完全にはよく分からないdocs

を参照してくださいにその場合、よりよい解決策があるかもしれません。

+0

ああ、迷惑です - もう一度質問を修正しました。 :-) – jMyles

関連する問題