ジャンゴマネージャ

ジャンゴマネージャ

で、特別なプロパティであるオブジェクトBook.objects.all()文では、データベースを照会することによって必要があります。

要するに、モジュールマネージャは、それを介してオブジェクト、Djangoのデータベースクエリモジュールです。Djangoの各モジュールは、少なくともマネージャを持っている、あなたは、データベースへのアクセスをカスタマイズするためのカスタムマネージャを作成することができます。

カスタムマネージャを作成します:1)追加の管理方法2最初のクエリセットの修理マネージャが返されます)。

1)余分なマネージャのメソッドを追加

追加の管理方法は、モジュールのテーブル・レベルの機能を追加するための好ましい方法です。

例えば、我々は、キーを必要とキーワードの本の数を返しブックtitle_count()メソッドのためのモデルを定義します。(この例は少しこじつけが、それは経営者がどのように機能するかを説明することができます。)

# models.py
from django.db import models

class BookManager(models.Manager):
    def title_count(self, keyword):
        return self.filter(title__icontains=keyword).count()
 
class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()
    num_pages = models.IntegerField(blank=True, null=True)
    objects = BookManager()   # 语法就是object=SomeManager
 
  def __unicode__(self):
    return self.title

このマネージャで、我々は今、これを行うことができます:

>>> Book.objects.title_count('django')
4
>>> Book.objects.title_count('python')
18

なぜ我々はtitle_countを追加したい()メソッドが行うのですか?クエリが頻繁にカプセル化するために使用されているので、我々はエンコード繰り返さないでください。
初期マネージャのクエリセットを変更します。

実質的クエリセットマネージャは、システム内のすべてのオブジェクトを返します。例えば、Book.objects.all()本のデータベースにすべての書籍を返します。

我々は、ベースクエリセットマネージャをオーバーライドするManager.get_query_set()メソッドをカバーすることができます。get_query_setは()あなたの要求とクエリセットに従ってを返します。

この例は、別の興味深い技術を指摘した:同じモデルに複数のマネージャーを使用して。あなたが好きなら、あなたはあなたのモデルのために複数の管理者()の例を追加することができます。これは、モデルのための一般的なフィルタを追加する簡単な方法です。

例えば:

class MaleManager(models.Manager):
  def get_query_set(self):
    return super(MaleManager, self).get_query_set().filter(sex='M')
 
class FemaleManager(models.Manager):
  def get_query_set(self):
    return super(FemaleManager, self).get_query_set().filter(sex='F')
 
class Person(models.Model):
  first_name = models.CharField(max_length=50)
  last_name = models.CharField(max_length=50)
  sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female')))
  people = models.Manager()
  men = MaleManager()
  women = FemaleManager()

この例では、実行することを可能にするPerson.men.all()Person.women.all()Person.people.all()あなたが望む結果を、クエリを生成します。

カスタムManagerオブジェクトを使用する場合は、特別な地位を持っている(勝つモデルで定義された位置に)、Djangoの最初の遭遇マネージャーに注意してください。Djangoは間違いなくモデルマネージャーとしてこれを使用するデフォルトのマネージャーとして定義された最初のマネージャー、(adminアプリケーションを含むがない)多くのジャンゴの部分になります。結論は、あなたのデフォルトのマネージャーを選択するように注意しなければならないということです。カバレッジget_query_set()は、あなたに無用の返還を受けることができるので、あなたはこれを避けるために持っています。

おすすめ

転載: www.cnblogs.com/wangjiale1024/p/11391236.html