Django的select_related()和django-mptt。如何一次获取所有兄弟节点?

4

我正在试图获取当前页面的所有兄弟页面。 Page 模型如下:

class Page(MPTTModel):
    title = models.CharField(max_length=255)
    slug = models.SlugField(max_length=255, blank=True) # changing to CharField from SlugField
    markdown = models.TextField()
    parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True,
                                 blank=True, related_name='children')

获取所有兄弟页面的代码如下:
pages = page.get_siblings(include_self=True)

上述代码的问题在于每个页面都会命中数据库。如果有50个页面,那么将导致50次查询。
我尝试使用select_related()解决这个问题,但没有成功。以下是我的尝试结果。
pages = page.get_siblings(include_self=True).select_related()

# this too doesn't work
pages = page.get_siblings(include_self=True).select_related('parent')

在寻找解决方案时,我偶然发现了这个页面。该页面显示,可以使用select_related()调用get_siblings()

我做错了什么?


1
我无法复现 n 个查询。你的树看起来像什么? - aaron
罪魁祸首是 get_absolute_url() 方法。它被调用了每一页。我通过添加一个列来存储 URL 来解决了这个问题。就这样。我应该关闭这个问题吗? - Cody
如果问题的解决方式不太可能对未来的读者有所帮助,那么是的。 - aaron
2个回答

1

1
感谢回复。但事实证明,django-mptt运行良好,是“get_absolute_url()”方法引起了问题。 - Cody

1
原来django-mptt工作正常,罪魁祸首是get_absolute_url()方法。我通过添加一个列来存储URL解决了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接