現在、基本的な時間記録アプリを構築しており、django-taggit を使用する todo モデルがあります。私の Todo モデルは次のようになります。
class Todo(models.Model):
project = models.ForeignKey(Project)
description = models.CharField(max_length=300)
is_done = models.BooleanField(default=False)
billable = models.BooleanField(default=True)
date_completed = models.DateTimeField(blank=True, null=True)
completed_by = models.ForeignKey(User, blank=True, null=True)
tags = TaggableManager()
def __unicode__(self):
return self.description
プロジェクト内のすべての Todo の一意のタグのリストを取得しようとしていますが、集合内包表記を使用してこれを機能させることができましたが、プロジェクト内のすべての Todo について、データベースにクエリを実行してタグを取得する必要があります。私の集合理解は次のとおりです。
unique_tags = { tag.name.lower() for todo in project.todo_set.all() for tag in todo.tags.all() }
これは問題なく機能しますが、プロジェクト内のすべての todo に対して個別のクエリを実行して、すべてのタグを取得します。これらの重複したクエリを回避するために、 prefetch_related に似たことができる方法があるかどうか疑問に思っていました:
unique_tags = { tag.name.lower() for todo in project.todo_set.all().prefetch_related('tags') for tag in todo.tags.all() }
前のコードを実行すると、次のエラーが表示されます。
'tags' does not resolve to a item that supports prefetching - this is an invalid parameter to prefetch_related().
誰かがここで非常によく似た質問をしているのを見ました: Optimize django query to pull external key and django-taggit relationship, but it's like it'd like a strong answer. 誰かが私を助けてくれることを望んでいました。ありがとう!