django select_related() 和 django-mptt。如何一次获取所有兄弟姐妹?

django select_related() and django-mptt. How to fetch all the siblings at once?

我正在尝试获取当前页面的所有同级。 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')

在搜索解决方案时,我偶然发现了 this 页面。这表明可以使用 get_siblings().

调用 select_related()

我做错了什么?

您是否尝试使用标准方式访问 Django 模型范例中的 sibling/parent 对象?

你可以在这里找到一个例子:

在您的特定情况下,代码段应如下所示:

MPTTModel.objects.filter(page__pk=page.pk)

原来我们的 django-mptt 工作正常,罪魁祸首是 get_absolute_url() 方法。我通过添加一列来存储 url.

解决了这个问题