Python 通过查询访问MPTT模型的get_root
考虑以下示例:Python 通过查询访问MPTT模型的get_root,python,django,django-mptt,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) ModelX.objects.filt
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)
ModelX.objects.filter(fieldX__get_root=match)
或者像这样直接调用get\u root()
更好
ModelX.objects.filter(fieldX__root=match)
ModelX.objects.filter(fieldX__get_root=match)
这将使root()
方法变得多余
不过,以上这些似乎都不起作用。为什么呢 .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)
.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)
谢谢,但那不是我想要的。我想得到所有ModelX对象,其fieldX指向具有特定根的foreignkey。希望这是有意义的。
fieldX
应该指向一个根节点或某个根节点的任何后代?还有一个细节:是否只有一个根节点,或者可以是多个根节点?这一点很重要,因为mptt
没有用于的内置方法。获取子体
以获取节点列表。我不确定我是否理解您的意思,但不知道,每个对象应该只有一个关联的根节点(可以通过get\u root()
访问)。所以我的问题是,我想得到属于特定根节点的所有对象。谢谢,但这不是我想要的。我想得到所有ModelX对象,其fieldX指向具有特定根的foreignkey。希望这是有意义的。fieldX
应该指向一个根节点或某个根节点的任何后代?还有一个细节:是否只有一个根节点,或者可以是多个根节点?这一点很重要,因为mptt
没有用于的内置方法。获取子体
以获取节点列表。我不确定我是否理解您的意思,但不知道,每个对象应该只有一个关联的根节点(可以通过get\u root()
访问)。所以我的问题是,我想得到属于特定根节点的所有对象。