请考虑以下示例:
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()
方法变得多余。
上述情况似乎都不起作用。这是为什么?
答案 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)