1

以下の例を検討してください。

class ModelX(models.Model):
    fieldX = models.ForeignKey(ModelY)

class ModelY(MPTTModel):

    def root(self):
        return get_root()

    root = property(root)

今、私はこのようなクエリを作成したいと思います

ModelX.objects.filter(fieldX__root=match)

get_root()または、このように直接呼び出す方がよい

ModelX.objects.filter(fieldX__get_root=match)

これにより、root()メソッドが不要になります。

しかし、上記のどれもうまくいかないようです。何故ですか?

4

1 に答える 1

1

.filter()キーワード引数としてフィールドルックアップを取ります。ドキュメントから:

Django 1.4で変更:ルックアップで指定されるフィールドは、モデルフィールドの名前である必要があります。ただし、例外が1つあります。ただし、ForeignKeyの場合は、接尾辞が_idのフィールド名を指定できます。この場合、valueパラメーターには、外部モデルの主キーの生の値が含まれていることが期待されます。

これは、モデルメソッドに基づいてクエリを実行できないことを意味します。あなたを助けるかもしれないいくつかのスニペットがあります:

#returns all ModelX objects related to root nodes
ModelX.objects.filter(fieldX__level=0)

#first: get descendants of root node with id=1 (it can be any field lookups)
#second: get all ModelX nodes, related to previously founded nodes
nodes = ModelY.object.get(level=0, id=1).get_descendants()
ModelX.objects.filter(fieldX__in=nodes)
于 2012-10-22T17:42:07.233 に答える