У меня есть просмотр страницы в Django, настроенный следующим образом:
blog = get_object_or_404(Blog, subdomain=extracted.subdomain)
all_posts = Post.objects.filter(
blog=blog, publish=True).order_by('-published_date')
nav = all_posts.filter(is_page=True)
posts = all_posts.filter(is_page=False)
Это вызывает доступ к базе данных 3 раза. Я пытаюсь оптимизировать это, чтобы получить доступ к БД только один раз. Следующий фрагмент сокращает количество вызовов до 2, но я уверен, что есть способ получше, о котором я не знаю.
blog = get_object_or_404(Blog, subdomain=extracted.subdomain)
all_posts = Post.objects.filter(
blog=blog, publish=True).order_by('-published_date')
nav = []
posts = []
for post in all_posts:
if post.is_page:
nav.append(post)
else:
posts.append(post)
Насколько я понимаю, prefetch_related
и select_related
работают наоборот, и я не уверен, как их реализовать в этом контексте.
Мои модели настроены следующим образом:
class Blog(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
title = models.CharField(max_length=200)
...
class Post(models.Model):
blog = models.ForeignKey(
Blog,
on_delete=models.CASCADE,
related_name='post')
title = models.CharField(max_length=200)
...
Заранее спасибо!
Редактировать:
А для некоторых причина, по которой выполняется 3 запроса к БД
blog = get_object_or_404(Blog.objects.prefetch_related('post_set'), subdomain=extracted.subdomain)
posts = blog.post_set.filter(publish=True).order_by('-published_date')