通过查询访问MPTT模型的get_root

时间:2012-10-22 16:38:45

标签: python django django-mptt

请考虑以下示例:

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()方法变得多余。

上述情况似乎都不起作用。这是为什么?

1 个答案:

答案 0 :(得分:1)

.filter()用作关键字参数field lookups。来自docs:

  

在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)