django_filter的な値/ values_list

from django.db import models

class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __str__(self): # __unicode__ on Python 2 return self.name class Author(models.Model): name = models.CharField(max_length=50) email = models.EmailField() def __str__(self): # __unicode__ on Python 2 return self.name class Entry(models.Model): blog = models.ForeignKey(Blog) headline = models.CharField(max_length=255) body_text = models.TextField() pub_date = models.DateField() mod_date = models.DateField() authors = models.ManyToManyField(Author) n_comments = models.IntegerField() n_pingbacks = models.IntegerField() rating = models.IntegerField() def __str__(self): # __unicode__ on Python 2 return self.headline 

値(*フィールド)
ValuesQuerySetを返す-クエリセットのサブクラスではなく、オブジェクトのモデルの反復インスタンスの辞書を返します。

各辞書には、モデルオブジェクトの属性名に対応するオブジェクトのキーを表します。

従来のモデルオブジェクトと比較して、以下の実施例値():

# This list contains a Blog object.
>>> Blog.objects.filter(name__startswith='Beatles') [<Blog: Beatles Blog>] # This list contains a dictionary. >>> Blog.objects.filter(name__startswith='Beatles').values() [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}] 

値()フィールドはSELECTを限定されるべき指定任意の位置パラメータ・フィールドを、受信します。指定したフィールド場合は、各辞書は、フィールドにのみ指定されたキー/値が含まれます。フィールドが指定されていない場合、各辞書は、データベーステーブル内のすべてのフィールドのキーと値を含みます。

例えば:

>>> Blog.objects.values() [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}], >>> Blog.objects.values('id', 'name') [{'id': 1, 'name': 'Beatles Blog'}] 

:これは、ことは注目に値する
あなたがフィールドを持っている場合fooされForeignKey、デフォルトのvalues()呼び出しは辞書と呼ばれるだろう返しfoo_id、これは実際の値(保持隠されたモデルの属性の名前であるとして、キーfooに関連する属性参照モデル)。お問い合わせの際values()とパスフィールドの名前を、渡すことfoo、またはfoo_idすることができ、結果は同じ(フィールド名が辞書のキーはあなたに配信されます一致する)です。

例えば:

>>> Entry.objects.values() [{'blog_id': 1, 'headline': 'First Entry', ...}, ...] >>> Entry.objects.values('blog') [{'blog': 1}, ...] >>> Entry.objects.values('blog_id') [{'blog_id': 1}, ...] 
  • ときの値()と組み合わせて使用​​すると、ソートに注意を払うが、最終結果に影響を与える可能性がある()に異なります。詳細については、個別の()メモを参照してください。

  • フィールドの値は、(選択パラメータは(余分な定義され、後に余分な位置)句は()と呼ばれている)、明示的に値()の呼び出しに含まれている必要があります。余分な()呼び出しの背中に値()の呼び出しは、選択した追加のフィールドを無視します。

  • のみ()と延期()値の呼び出し()合理的ではないの後に、それはNotImplementedErrorにつながります。

ジャンゴ1.7の新機能:
最後のポイントを追加します。以前は、()の後の値()で許可されているのみ()と延期を呼び出しますが、それはどちらかクラッシュしたり、誤った結果を返します。

ValuesQuerySetあなたが知っているために、あなたは、オブジェクトの関数モデルのインスタンスを使用することなく、フィールドの小さな部分を必要としています。唯一のより効率的なコースの分野で使用する]を選択します。

最後に、ノートValuesQuerySetそのQuerySetほとんどと同じように実装して、サブクラス。あなたはそれを呼び出すことができfilter()order_by()そして上のようにします。この手段は、2つの同一の呼び出し、次のよう:

Blog.objects.values().order_by('id')
Blog.objects.order_by('id').values()

前面にSQLのアプローチに影響を与え、その後、メソッドを配置しますようにDjangoの作者は、出力(例えば、値を())に影響を与えるが、実際にそれは問題ではありません。これはあなたの人格を誇示する良い機会です。

あなたがOneToOneField、ForeignKeyのとのManyToManyField財産後方参照フィールドモデルに関連することができます。

Blog.objects.values('name', 'entry__headline')
[{'name': 'My blog', 'entry__headline': 'An entry'},
     {'name': 'My blog', 'entry__headline': 'Another entry'}, ...]

警告

ためManyToManyFieldのフィールドと逆関連は、増幅を引き起こす可能性がある複数の結果セットを含む複数の関連する行を有するかもしれません。あなたがいる場合values()、このような分野で複数のクエリが含まれ、この場合に、より明白になるであろうすべての可能な組み合わせを返します。

values_list

values_list(*フィールド、フラット=偽 )
と値()と同様であるが、反復はなく辞書のタプルがある場合に返されます。各タプルはvalues_list()コールフィールドの値が含ま-最初の要素は最初のフィールドである、というようになります。例えば:

>>> Entry.objects.values_list('id', 'headline') [(1, 'First entry'), ...] 

あなたが唯一のフィールドを渡す場合は、平らなパラメータを渡すことができます。Trueの場合、それが返された結果が単一の値ではなく、タプルで表します。例では、それらの間の明確な違いを生むだろう。

>>> Entry.objects.values_list('id').order_by('id') [(1,), (2,), (3,), ...] >>> Entry.objects.values_list('id', flat=True).order_by('id') [1, 2, 3, ...] 

複数のフィールドがある場合は、合格flatエラーが発生しました。

あなたが任意の値を渡さない場合values_list()、それはモデルで定義されたフィールドの順になり、モデル内のすべてのフィールドを返します。

(注)このメソッドが返しますValuesListQuerySetこのタイプの挙動はリストに似ています。使用するのに十分ですが、実際のPythonのリストオブジェクトが必要な場合、あなたはそれを呼び出すことができますほとんどの時間はlist()、それはクエリセットを評価します。

例えば:

School.objects.filter(school_id=1).values_list("id", "flat = true")

ORMは、上記説明しました:

学校のルックアップテーブルは、ID、IDのリストではなく、タプルの単一のリストを返しますID 1、としてschool_id。

大きな違い、values_list高速化。フラットリストオブジェクトインスタンスのすべてが、データベースにのみ値を返すことはPython必要はないので、それは、高速であることは事実=。

それが最初のクエリセットリストがvalues_list計算されることはありません-それは、単一のクエリにそれらを結合しますので、Djangoは、私たちはクエリセットを使用してクエリとして設定したパラメータを認識するのでより速くそれを証明するために、
もう一つ注意すべきは、リストの内包ということです値は/異なる動作をvalues_list:

  • 値/ values_listフィールドに格納された生成された実際の値、すなわち、唯一のID(オブジェクト全体)
  • 値が外部キーである、モデル内の適切な関係を設定した場合、それは外部キー参照を理解するためにオブジェクトのリストを提供します
class Building(models.Model): corporation = models.ForeignKey('company.Corporation', verbose_name=u'学校', related_name='buildings') number = models.CharField(u'楼栋编号', max_length=10, unique=True, db_index=True) create_time = models.DateTimeField(u'创建时间', auto_now_add=True) 

フィールドリストの建物の数を取得します

In [1]: from apps.dormitory.models import Building In [2]: buildings = Building.objects.values('number') In [3]: buildings Out[3]: [{'number': u'1'}, {'number': u'2'}, {'number': u'3'}, {'number': u'4'}, {'number': u'5'}] In [4]: buildings_ = Building.objects.values_list('number') In [5]: buildings_ Out[5]: [(u'1',), (u'2',), (u'3',), (u'4',), (u'5',)] In [6]: buildings_list = Building.objects.values_list('number', flat=True) In [7]: buildings_list Out[7]: [u'1', u'2', u'3', u'4', u'5'] 

上記のようにコードから見ることができます。

値メソッドは、辞書番号フィールドのリストを取得することができます。

values_listはタプルの数のリストを取得することができます。

この方法は、多数のフラット= Trueの値のリストを取得することができますパラメータを追加values_list。




リンクします。https://www.jianshu.com/p/7c7645674ae0

おすすめ

転載: www.cnblogs.com/zmdComeOn/p/12173444.html