2017-11-12 24 views
1

私のmodels.py:。ジャンゴ:Q(...)&Q(...)は、フィルタ(...)と同じではありませんフィルタリング(...)

class Words(models.Model): 

    sentence = models.ForeignKey(Sentences, related_name='sentence_having_this_word') 
    wordtext = models.CharField(max_length=250) # NOT UNIQUE. words written similarly can appear, as long as the sentences are different. 

class Sentences(BaseModel): 
    pass 

レッツのは、私が2つの文を持っていると言う: I see a tree and a house.the tree is in front of the house.

Wordsが含まれています:'I''see''a''tree''and''a''house'(ForeignKeyの持つすべてのこれらの単語の最初の文に)、'the'、を,'is','in','front','of','the','house'(これらの語は、第2文にFKを付ける)。

私はこれら2つの単語が同じように書かれた文章を探しています。'tree''house'です。

私はない:

Sentences.objects.filter(Q(sentence_having_this_word__wordtext='tree')&Q(sentence_having_this_word__wordtext='house')).all()

==> []。結果ん

が、私がしなければいいえ:私はQ(...)&Q(...)filter(...).filter(...)は同じものだと思っていた I see a tree and a house.the tree is in front of the house.

Sentences.objects.filter(sentence_having_this_word__wordtext='tree').filter(sentence_having_this_word__wordtext='house')).all()

は==>私は期待どおりの結果を持っていますか?

EDIT&オペレーターは動作しません。それが働いているand

、...ドキュメント内

、それは言及していないが(https://docs.djangoproject.com/en/1.7/topics/db/queries/#complex-lookups-with-q-objects

答えて

0

この動作は"Spanning multi-valued relationships"の下に記載されています。

この場合の逆外部キーなどのルックアップが複数値の関係にまたがる場合、単一の.filter()コール内のフィルタは、両方の条件を満たす1つの関連オブジェクトを持つオブジェクトをフィルタリングします。この場合、Sentenceは、wordtext'tree''house'の両方に等しい単一の関連するWordsインスタンスを持つ必要があります。もちろん、この条件は決して真実ではありません。

複数の.filter()コールが使用されている場合、異なるオブジェクトがフィルタに一致する可能性があります。その場合、Sentenceは、wordtext'tree'に等しく少なくとも1つの(しかしおそらく異なる)Wordsインスタンスとwordtext'house'に等しい少なくとも1つの関連するWordsインスタンスを持たなければなりません。

andでのクエリはではありません。は期待通りに動作します。 andは、最後の真理値を返す論理演算子です。非空Qオブジェクトは、そう、truthyです:

Q(sentence_having_this_word__wordtext='house') 

あなたが'house'が含まれていますが、'tree'が含まれていない何の文章を持っていないので、結果は同じですが、:

Q(sentence_having_this_word__wordtext='tree') and Q(sentence_having_this_word__wordtext='house') 

があると評価しますクエリは実行されません。

+0

これを書いて時間を割いてくれてありがとう。それは今非常に明確です! – ThePhi

関連する問題