1

django 1.7 で django-mssql 1.6.2 パッケージを使用して、sql server 2008 からテーブルの 1 つまたは複数のレコードを取得しています。次のように「get」または「filter」を呼び出すと、すべて問題ありませんが、サーバー プログラムが非常に遅くなります。次の表を検討してください。

class Contact(models.Model):
      id = models.IntegerField(primary_key=True, unique=True, null=False)
      address = models.CharField(max_length = 100)
      phone = models.IntegerField(unique=True)

class Parent(models.Model):
      id = models.IntegerField(primary_key=True, unique=True, null=False)
      name = models.CharField(max_length = 50)
      contact = models.OneToOneField(Contact)

class Student(models.Model):
      id = models.IntegerField(primary_key=True, unique=True, null=False)
      name = models.CharField(max_length = 50)
      parent = models.ForeignKey(Parent)

次のようなテンプレートでテーブルを印刷したいとします。

Student name  |  Parent name  |  Parent phone number
John          |  Jack         |  1111111
Susan         |  Jack         |  1111111
Dan           |  Jack         |  1111111
Jackie        |  Sara         |  2222222

次のようなコードを使用します。

    query_results = list()
    parents = Parent.objects.all()
    for any_parent in parents:
        students = Student.objects.filter(parent=any_parent)
        for student in students:
            element = TempObjectForStudent()
            element.student_name = student.name
            element.parent_name = any_parent.name
            element.parent_phone = any_parent.contact.phone
            query_results.append(element)

         if students.__len__() == 0:
            element = TempObjectForStudent()
            element.student_name = 'without any active student'
            element.parent_name = any_parent.name
            element.parent_phone = any_parent.contact.phone
            query_results.append(element)

class TempObjectForStudent():
    student_name = None
    parent_name = None
    parent_phone = None

次のようなテンプレートを使用します。

{% for row in query_results %}
    <tr><td>{{ row.student_name }}</td><td>{{ row.parent_name }}</td><td>{{ row.parent_phone }}</td></tr>

前述したように、問題はこの方法で大量のクエリを実行する速度です。結合を使用してすべてのテーブル データを 1 つのクエリで配信するにはどうすればよいですか?

4

1 に答える 1

1

わかりました、あなたはそれを少し複雑にしすぎました。

TempObjectForStudent は必要ありません。それなしで学生のインスタンスを取得できます。モデルのフィールドに arelated_nameを追加するだけで、ドット表記を使用してオブジェクトへの参照を取得できます。StudentparentParent

idまた、Django は各モデルにフィールドを自動的に与えることに注意してください。詳細については、こちらこちらをご覧ください。そのため、モデルでそのフィールドを明示的に作成する必要はありません。

あなたの質問に関して、私は次のようにします:

# models.py
class Parent(models.Model):
      name = models.CharField(max_length = 50)
      contact = models.OneToOneField(Contact)

class Student(models.Model):
      name = models.CharField(max_length = 50)
      parent = models.ForeignKey(Parent, related_name='students')

# views.py
parents = Parent.objects.all()

# template.html
{% for parent in parents %}
    <tr>
        <td>
            {% with parent.students.all as students %}
                {% for student in students %}
                    {{ student.name }}
                {% empty %}
                    'without any active student'
                {% endfor %}
            {% endwith %}
        </td>
        <td>
            {{ parent.name }}
        </td>
        <td>
            {{ parent.contact.phone }}
        </td>
    </tr>
{% endfor %}

アップデート:

select_relatedQuerySet メソッドに出会いました。これはあなたが探していたものだと思います!SQLJOIN句を使用し、関連するすべてのオブジェクトのフィールドをSELECTステートメントに含めます。詳細はこちらをご覧ください。それが役立つことを願っています!

于 2016-07-30T22:33:47.890 に答える