2017-11-16 5 views
2

アイテムはParnetフィールドではなく、Childフィールドでは存在しない行を取得するためにクエリを実行することに苦労しました。Djangoクエリテーブルは、親フィールドにのみ存在するアイテムを検索します。

これはモデルです。

class Item(models.Model): 
    text = models.CharField() 

class ItemRelations(models.Model): 
    child = models.ForeignKey('Item', related_name='itemchild') 
    parent = models.ForeignKey('Item', related_name='itemparent') 

だから、私は子ではないが親である項目だけを除外したい。私はそれをfirstParentと呼びます。

私は非常に多くの異なる方法を試しました。私はこのようなことを達成したい。

可能ですか?それとも、これを管理するためにいくつかのクエリとループを作成する必要がありますか?

答えて

1

私はあなたがこのコメントに与えてくれた具体的な例ではisnullfilter for readability.

firstParent = Item.objects.filter(itemparent=self, itemchild__isnull=True)

を使用してお勧めする、Item.pkItemクラスの属性です。クラスではなくアイテムインスタンスが必要です。

私は疑問があると、再読み込み、信じる:

アイテムが親ではなく子である項目を表示します。その場合:

firstParent = Item.objects.filter(itemparent__isnull=False, itemchild__isnull=True)は、それに一致するオブジェクトのクエリセットを提供します。

その後、他の側面に合わせてさらにフィルタリングしたい場合があります。 django querysets are lazyを忘れないでください。実際のクエリ/データベースヒットを行う際にいくつかのフィルタを作成することを混同しないでください。

QuerySetは遅延しています。つまり、QuerySetを作成する動作にはデータベースアクティビティは含まれません。フィルタは一日中スタックすることができ、DjangoはQuerySetが評価されるまで実際にはクエリを実行しません。

+0

自己私は定義された名前ではありません。私の例ではItem pkを参照するだけです。私が '自己'を使用すると、それは私に与えられる_Exception値:\t 'self'は定義されていません。私は自分の代わりにItem.pkを試しましたが、_int()の引数は文字列、バイトのようなオブジェクトまたは数字でなければなりませんでした。 'property'_ – sumpen

+0

私はいくつか考えてから答えを編集しました。私はあなたが使用したコードの例を公平に使用しました! – Withnail

+0

はい、私は親であるが子供ではないアイテムを表示したいと思います。編集したこのクエリでは、親であったアイテムをすべて取得します。しかし、彼らがまだ子供であれば、私はまだそれらを手に入れます。私はアイテムが決して子供ではなかったことを確認したい。私が_itemchild__isnull = True_を使うだけなら、私はもっと近づくでしょう。しかし、私はまた、項目が子供を割り当てられていることを確認したい、他の単語で、親です。両親はいない。それが意味をなさないかどうかわかりません。 – sumpen

0

可能です。

firstParent = Item.objects.exclude(child=self).filter(parent=self) 

フィルタ前に除外します。

+0

'self'は名前空間ではありません。私の質問ではItemを表しています。アイテムそのものが親に存在し、子ではないこと。私が*** =自己***を入力した場合_Exception値:\t 名前 '自己'が定義されていない_ – sumpen

関連する問題