0

誰かが私に次の例で最善のアプローチを教えてもらえますか...

ページ上で、「グループ」オブジェクトをIDでロードします。また、そのグループに属するすべての連絡先を(ページングを使用して)一覧表示したいと思います。

ページングの問題のため、2番目のデータベースクエリを実行することを考えていました...

私からしてみれば...

group = get_object_or_404(Group, pk=id)
contacts = Contacts.objects.filter(group=x) 

しかし、私はすでにグループにデータベースを2回ヒットさせているので、これは無駄に思えます。

私のモデルを参照してください。

class GroupManager(models.Manager):

    def for_user(self, user):
        return self.get_query_set().filter(user=user,)


class Group(models.Model):
    name = models.CharField(max_length=60)
    modified = models.DateTimeField(null=True, auto_now=True,)

    #FK
    user = models.ForeignKey(User, related_name="user")

    objects = GroupManager()


    def get_absolute_url(self):
        return reverse('contacts.views.group', args=[str(self.id)])


class Contact(models.Model):

    first_name = models.CharField(max_length=60)
    last_name = models.CharField(max_length=60)

    #FK
    group = models.ForeignKey(Group)
4

1 に答える 1

1

これは、select_related次の目的で設計されています。

外部キー関係を自動的に「追跡」するQuerySetを返し、クエリの実行時に追加の関連オブジェクトデータを選択します。これはパフォーマンスを向上させるものであり、(場合によってははるかに)大きなクエリが発生しますが、後で外部キー関係を使用するためにデータベースクエリは必要ありません。

あなたの場合は次のようになります。

Group.objects.select_related().get(pk=group) 

これで、各FKルックアップで、データベースに再度アクセスすることはありません。

次のステップは、次の「ページ」が呼び出されるたびにデータベースにアクセスしないように、キャッシュAPIを使用して結果をキャッシュすることです。これは、データが時間に敏感でない場合に役立ちます。

于 2013-03-17T10:58:45.590 に答える