5

次のようなビューにQuerySetがあります。他のビューでも同じクエリを使用できるようにしたいのですが、コードをコピーして貼り付ける必要はありません。これはまた、私がDRYプリンシパルに違反しているように感じます。

後日クエリを変更したい場合は、すべてのビューでクエリを変更する必要がありますが、これは明らかに理想的ではありません。作成する必要のあるクラスや、さまざまなビューからこれを呼び出すことができるメソッドがモデルにありますか?これに関するベストプラクティスはありますか?

tasks = Task.objects.filter(user = request.user).order_by('-created_at', 'is_complete')

4

1 に答える 1

4

解決策の 1 つは、モデルまたは拡張モデルのマネージャーでクラスメソッドを作成することです。

from django.db import models

  1. クラスメソッドの追加

    class MyModel(models.Model):
        @classmethod
        def get_user_tasks(cls, user):
            return cls.objects.filter(...).order_by(...)
    
  2. オーバーライド マネージャー

    class MyModelManager(models.Manager):
        def get_user_tasks(self, user):
            return self.filter(...).order_by(...)
    
    class MyModel(models.Model):
        objects = MyModelManager()
    
    # and in the view...
    queryset = MyModel.objects.get_user_tasks(request.user)
    
于 2012-12-26T14:21:33.670 に答える