2017-09-29 3 views
0

私は、最適化のためにprefetch_relatedとselect_relatedの使用を理解しようとしています。私はブログのどこかで、プリフェッチとセレクトを使用する場所の1つがprefetch_relatedがリバースリレーションに使用され、select_relatedがフォワードリレーションに使用されていることを学びました。私の場合、レジュームモデルと教育モデルがあります。教育モデルでは、照会の際に_setを追加する代わりに、related_nameでリバース関係を再開するFKがあります。私は、要求されたユーザーのすべての教育を、要求されたユーザーの履歴書と共に一覧表示する必要があります。私は私が代わりに以下を使用しようとしたとき、私はここでタイトルにAttributeError: 'Resume'オブジェクトに属性 'prefetch_related'がありません

education_instance = Resume.objects.filter(applicant=request.user).prefetch_related('educations') 

を述べたエラーが出る従う

education_instance = Resume.objects.get(applicant=request.user).educations.all() 

として、これらの最適化技術なしでこれを行うことが、私のモデルは

class Resume(models.Model): 
    applicant = models.OneToOneField(User, on_delete=models.CASCADE) 
    name = models.CharField(max_length=100, blank=False, null=False, help_text="Full Name") 

class Education(models.Model): 
    resume = models.ForeignKey(Resume, related_name='educations') 
    name = models.CharField(max_length=100, blank=False, null=False, help_text="Name of an institution") 
です

誰でも簡単な素人用語でselect_relatedとprefetch_relatedで私を明確にすることはできますか?私はあなたがいないResumeQuerySet、オブジェクトResume.prefetch_related()を呼び出そうとしている、私はあなたが提供する例外から

答えて

2

を取得しています問題を理解することができませんでした。

だから、あなたが

Resume.objects.filter(applicant=request.user).prefetch_related('educations') 

関連の選択関連プリフェッチについて知ってもらうために投稿しない

Resume.objects.get(applicant=request.user).prefetch_related('educations') 
+0

そのように私はすべての代わりに1つだけのクエリを取得します – milan

+0

@milanあなたは1つの 'QuerySet'をどういう意味ですか? –

0

すべての最初は、この通過する[1]

[prefetch_relatedのドキュメント] [1]:https://docs.djangoproject.com/en/1.11/ref/models/querysets/#prefetch-related、あなたは、あなたが教育モーダルに適用する必要があり、この

と同じように使用することはできませんがわかります

education_instance = Education.objects.filter(resume__applicant == request.user).prefetch_related('resume') 

希望すると、これが役に立ちます。

+1

ありがとうございます。皆さんが私のために紹介したすべてのリンクを見ていきます。そのリンクに行く前に、私はそれに入るかどうかわからないので、私はprefetch_relatedの中でその履歴書が何であるかを質問したいと思います。教育の表のフィールド(fk)ですか? – milan

+0

prefetch_relatedのはい再開は教育表のfkです。 –

1

実際には、この場合はselect_relatedを使用する必要があります。 私が知る限り、prefetch_relatedは多対多の関係に使用され、select_relatedは通常のfkまたは1対1の関係に使用され、joinを使用して1つのクエリ内のすべてのオブジェクトをフェッチしながらオブジェクトを取得する2つのクエリを行います。

関連する問題