1. ホーム
  2. Django

django のクエリセット操作

2022-03-02 08:53:29

から取得した。 http://jfy3d.iteye.com/blog/483482

    number = len(isps)
    isp = isps[0]
# a2 = isps[-1] # Subscripts cannot be negative
    for isp in isps:
        print isp.ispName
   
    isp_list = list(isps)
    for isp_str in isp_list:
        print isp_str
       
    isp_reps = repr(isps)
    print isp_reps
    
Return results.
2
1
China Mobile
CenturyLink
ISPModel object
ISPModel object
ISPModel object
ISPModel object
[<ISPModel: ISPModel object>, <ISPModel: ISPModel object>, <ISPModel: ISPModel object>, <ISPModel: ISPModel object>]



クエリ API リファレンス

この文書では クエリセット このAPIは、既存のモデル情報やデータベースクエリの知識に基づいているので、事前にこれらのドキュメントを読み、理解する必要があります。

このリファレンスでは、既存のウェブログの例を使用します。

QuerySetsが評価されるとき

内部的には QuerySetは、値を要求されるまで、実際にデータベースに触れることなく、構築、フィルタリング、切り取り、配布されます。

を変更することができます。 クエリセット クエリーの値

  • ドロップします。QuerySetはドロップ可能で、最初にデータベースクエリを実行します。たとえば、これはデータベース内のすべてのエントリーの見出しを表示します。
Pythonコード
for e in Entry.objects.all():
    print e.headline

  • スライシングを行う。QuerySet を制限すると言いましたが、QuerySet は Python の配列スライシング構文を使ってスライスすることができます。通常、 QuerySet をスライスすると別の QuerySet を返しますが、 Django は "step" というスライス引数の構文を使うと、データベースクエリを実行し てくれます。
  • シリアライゼーションとキャッシュ。QuerySetsをシリアライズする際の詳細については、次のセクションを参照してください。Querysetの結果は、データベースから読み取ることが重要です。
  • repr(). repr() が呼ばれると、QuerySet が評価されます。これは、Pythonでの対話的な解釈を容易にするためで、APIの対話が実行されるとすぐに結果を見ることができます
  • len()を使用します。len() がコールされると、QuerySet が評価されます。ご想像のとおり、これはクエリセットの数を返します。
  • list()を使用します。値を強制的に
    例えば
    Pythonコード   
    entry_list = list(Entry.objects.all())
    
    
    

クエリセットAPI

通常、手動で作成することはありませんが、QuerySetを宣言したManagerを渡します。

クラス クエリセット ( [ model=None ] )

通常、通信を行う場合は クエリセットの場合、フィルタチェーンを使用します。 クエリセット メソッドは、すべて新しい クエリセット

QuerySet メソッドは、新しい QuerySet を返します。

フィルタ(**kwargs)

クエリパラメータをマッチングした後、新しい QuerySet を返します。

<スパン exclude(**kwargs)

クエリパラメータにマッチしなかった場合、新しいQuerySetを返します。

Pythonコード
Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3), headline='Hello')



SQLに変換

Sqlコード
SELECT ...
WHERE NOT (pub_date > '2005-1-3' AND headline = 'Hello')

Pythonコード
Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3)).exclude(headline='Hello')



 SQLに変換

Sqlコード
SELECT ...
WHERE NOT pub_date > '2005-1-3'
OR NOT headline = 'Hello'

この例では、すべての pub_date が <スパン '2005-1-3' または "hello"の見出しがある。

<スパン <スパン <スパン

order_by(*fields)

sort Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline')

の前に "-"を付けると降順になります。

reverse()

クエリ結果の並べ替えを反転させる

distinct()

重複排除

<スパン 値(*fields)

クエリ結果をmodコレクションではなく、辞書リストに変換します。

Pythonコード
# 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.'}]

結果フィールド名を指定することも可能です。

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


values_list(*fields)

クエリ結果セットのmodをタプルに変換する

Pythonコード
>>> Entry.objects.values_list('id', 'headline')
[(1, u'Erster Eintrag'), ...]

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

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


all()

すべての結果を取得する

select_related()

関連データの取得、関連データの深さを設定することができます、設定されていない場合、関連データは、遅延ロードとして読み取られます。

Pythonコード
# Ruft die Datenbank auf.
e = Entry.objects.get(id=5)

# Ruft erneut die Datenbank auf, um das zugehörige Blog-Objekt zu erhalten.
b = e.blog


# Ruft die Datenbank auf.
e = Entry.objects.select_related().get(id=5)

# Greift nicht auf die Datenbank zu, da e.blog bereits in der vorherigen Abfrage # ausgefüllt wurde.
# in der vorherigen Abfrage vorausgefüllt wurde.
b = e.blog


class City(models.Model):
    # ...

class Person(models.Model):
    # ...
    hometown = models.ForeignKey(Stadt)

class Book(models.Model):
    # ...
    autor = models.ForeignKey(Person)


b = Book.objects.select_related().get(id=4)
p = b.author # Trifft nicht auf die Datenbank.
c = p.hometown # Trifft nicht auf die Datenbank.

b = Book.objects.get(id=4) # Kein select_related() in diesem Beispiel.
p = b.author # Treffer in der Datenbank.
c = p.hometown # Treffer in der Datenbank.


extra(select=None, where=None, params=None です。 tables=None です。 order_by=None です。 select_params=None

拡張クエリ

DJANGO のクエリ API ではクエリ条件を簡単に設定できない場合があり、クエリを拡張する別の方法を提供します。 エクストラ

セレクト

Pythonコード
Entry.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"})


Pythonコード
Blog.objects.extra(
    select={
        'entry_count': 'SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id'
    },
)


Pythonコード
Blog.objects.extra(
    select=SortedDict([('a', '%s'), ('b', '%s')]),
    select_params=('eins', 'zwei'))


<スパン どこ / テーブル
Pythonコード
Entry.objects.extra(where=['id IN (3, 4, 5, 20)'])


<スパン オーダーバイ

Pythonコード
q = Entry.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"})
q = q.extra(order_by = ['-is_recent'])


<スパン パラメータ

Pythonコード
Entry.objects.extra(where=['headline=%s'], params=['Lennon'])


 公式ドキュメントを参照する。

https://docs.djangoproject.com/en/dev/ref/models/querysets/