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 中更改:查找中指定的字段必须是模型字段的名称。但是有一个例外,如果是 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 回答