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.
解决了这个问题
我正在尝试获取当前页面的所有同级。 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.