2

jQueryテーブルソーターを使用しているため、ページ付けしたくない大量のデータを表示する必要がありPerson.objects.all()ます。ビューでの使用は、データベースにとって非常にコストがかかります。ロードに時間がかかりすぎるため、ビューで生のSQLを実行しようとしています。

objects.all()Djangoの一般的なビューを使用してみましたが、メソッドと同じくらい低速でした。

これが私のモデルです。var1基本的に、私はすべての人を、たとえば、またはに登場した回数を数えながら表示したいと思いますvar2

class Person(models.Model):
    name = models.CharField(max_length=64, blank=True, null=True)
    last_name = models.CharField(max_length=64,)
    slug = models.SlugField()

class Object(models.Model):
    title = models.ForeignKey(Title)
    number = models.CharField(max_length=20)
    var1 = models.ManyToManyField(Person, related_name="var1_apps", blank=True, null=True)
    var2 = models.ManyToManyField(Person, related_name="var2_apps", blank=True, null=True)
    var3 = models.ManyToManyField(Person, related_name="var3_apps", blank=True, null=True)
    # ...   
    slug = models.SlugField()

from django.db import connection
    def test (request):
        cursor = connection.cursor()
        cursor.execute('SELECT * FROM objects_person')
        persons = cursor.fetchall() # fetchall() may not be the right call here?
        return render_to_response('test.html', {'persons':persons}, context_instance=RequestContext(request))

レンプレート:

           <table class="table tablesorter">
               <thead>
                   <tr>
                   <th>Name</th>
                   <th>Var1</th>
                   <th>Var2</th>
                   <th>Var3</th>
                   </tr>
               </thead>
               <tbody>
                       {% for person in persons %}
                   <tr>
                       <td><a href="{{ person.get_absolute_url }}">{{  person.last_name }}{% if person.name %}, {{ person.name }}{% endif %}</a></td>
                       <td>{{ person.var1_apps.count }}</td>
                       <td>{{ person.var2_apps.count }}</td>
                       <td>{{ person.var3_apps.count }}</td>
                   </tr>
               {% endfor %}
               </tbody>
           </table>

何をするのかは空白行を繰り返しますが、呼び出すだけ{{ creator }}でSQLテーブル全体が表示されます-これは必要ありません。私はクエリで何か間違ったことをしているに違いないので、助けていただければ幸いです。

4

1 に答える 1

3

問題はではありませんPerson.objects.all()そのクエリセットをループすると、クエリセット内のすべてのアイテムに対して3つのクエリを実行して、カウントを計算します。

答えは、各フィールドのカウントでクエリセットに注釈を付けることです。

# in the view
persons = Person.objects.annotate(num_var1_apps=Count('var1_apps'),
                                  num_var2_apps=Count('var2_apps'),
                                  num_var3_apps=Count('var3_apps'),
                                  )

# in the template
{% for person in persons %}
               <tr>
                   <td><a href="{{ person.get_absolute_url }}">{{  person.last_name }}{% if person.name %}, {{ person.name }}{% endif %}</a></td>
                   <td>{{ person.num_var1_apps }}</td>
                   <td>{{ person.num_var2_apps }}</td>
                   <td>{{ person.num_var3_apps }}</td>
               </tr>
{% end for %}
于 2012-05-02T13:37:44.300 に答える