2017-06-02 18 views
2

を重複しました。DjangoのSQLクエリは、私はこれを含む<strong>models.py</strong>ファイルを持っている

私がしようとしているのは、質問された最後の5つの質問を取得し、それらの質問への回答、回答を提供したユーザー、そのユーザーのアバターなどを含むいくつかのデータとともに私のホームページに表示します。

views.py:と等...

私は現在、このviews.pyとhome.htmlテンプレートであることをやっている

home.html
@login_required(login_url="accounts/login/") 
def home_page(request): 
    last_five = Question.objects.all().order_by('-id')[:5] 
    last_five_in_ascending_order = list(reversed(last_five)) 
    return render(request, 'home.html', { 
     'question_list': last_five_in_ascending_order, 
    }) 

{% for question in question_list %} 
    <a href="{% url 'view_question' question.id %}">{{ question.text }}</a> 
    {% if question.answer_set.all %} 
     {% for answer in question.answer_set.all %} 
      <img src="/media/{{ answer.created_by.userprofile.avatar }}" alt=""> 
      <a href="{% url 'profile' answer.created_by.id %}"> 
       {% firstof answer.created_by.get_full_name answer.created_by.username %} 
      </a> 
      {{ answer.time_passed }} 
      {{ answer.text | safe }} 
     {% endfor %} 
    {% endif %} 
{% endfor %} 

データベースへのSQLクエリを減らすにはどうすればよいですか? 本当にこれらのことが心配すべきですか?ユーザーの活動がほとんどないウェブサイトに違いがありますか?

+0

あなたの質問は何ですか? – zaidfazil

+0

おそらく関連している:https://stackoverflow.com/q/33587557/3901060。 select_related(またはprefetch_related)QuerySetメソッドを使用して、質問とその回答を1つのクエリで結合します。 – FamousJameous

+0

@FazilZaid私は質問を忘れた:))私は今それを追加しました。 – arianhf

答えて

0

あなたがここにいるのは、単純な多対1の関係ではなく、テーブルの継承であり、それは本当に複雑になります。私は本当にこのような簡単なセットアップがここではテーブルの継承を必要とする理由は分かりません。このようなモデルの変更も同様です。

class Entry(models.Model): 
    text = models.TextField(default='') 
    time_created = models.DateTimeField(auto_now=False, auto_now_add=True) 
    time_updated = models.DateTimeField(auto_now=True, auto_now_add=False) 
    created_by = models.ForeignKey(User, on_delete=models.CASCADE) 

    class Meta: 
     abstract = True 
    #rest of code ... 

class Question(models.Model): 
    entry = models.OneToOneField(Question) 
    def get_absolute_url(self): 
     return reverse('view_question', args=[self.id]) 

class Answer(models.Model): 
    question = models.ForeignKey(Question, on_delete=models.CASCADE, default=None) 
    entry = models.OneToOneField(Question) 

実行されている多くのクエリの問題を解決します。現在select_related

Question.objects.select_related('entry) 
Answer.objects.select_related('entry', 'question') 

に頼るデバッグツールバーは現在の反復クエリが排除されたことが表示されます。

これらのことについて本当に心配する必要がありますか?ユーザーの操作がほとんどないウェブサイトでは の違いがありますか?

これらのクエリはすべて、主キーで関連オブジェクトを取得しようとするものではありません。どのデータベースでも、主キーを持つ単一項目のルックアップはO(log(N))です。しかし、対数の基底は通常aなので、心配する必要はありません。

これらを一度にすべてフェッチした場合は、より大きな定数を持つ単一のO(log(N))操作が行われているので、もちろん高速になります。しかし、小さなサイトでその違いが目立つかどうかは議論の余地があります。

+0

このようにすれば、すべてのテキストが1つのテーブルに追加されるわけではありませんか? これは、すべての要求に対してテーブル結合を行う必要があることを意味しますか? 私は自分のやり方が3の代わりに2つのテーブルを作成していると思うので、質問や回答が必要なときに参加する必要はありません。 私は間違っていますか?私がいれば、あなたの知識で私を啓発できますか? – arianhf

+0

あなたが今やっているやり方は、すべてのテキストを1つのテーブルに追加します:-) – e4c5

+0

参加__is__何がsqlであるか。あなたが結合を怖がっている場合は、SQLから離れてください。 sqlの全ポイントは、テーブル全体にデータを分散し、それらを__join__することです。あなたは反対のことをしようとしています – e4c5

関連する問題