Django ORM
16306 ワード
クエリーオブジェクト
Djangoでデータベースを検索するには、ManagerとQuerySetの2つのオブジェクトが必要です。データベースからオブジェクトを検索して、モデルのManageを通じてQuerySetを確立できます。QuerySetはデータベースのオブジェクトとして表現されています。彼は0つ以上のフィルタ条件があります。SQLでQuerySetはselect文をwhereまたはlimitでフィルタします。モデルのManageでQuerySetを取得します。
Manager
Managerの対象は模型類に添付されていますが、特に指定されていない場合は、各モデル類にobject属性があります。このモデルはデータベースで基本的に調べられます。
Managerのいくつかの一般的な方法: を返します。 を返す。 を検索する。
QuerySet類
QuerySetは動的なキーワードパラメータを受け取り、適切なSQL文に変換してデータベースで実行します。
QuerySetのいくつかの一般的な方法: を返す。 を追加する。
フィールドフィルタ
フィールド検索はSQL文のWHERE条件を指定する文で、QuerySetを通過する方法です。
フォーマットは:
look utypeには以下の種類があります。 より大きいです です。 を含みます 未満 に等しい。
記事のURLを参照してください:http://blog.javachen.com/2015/01/15/django-orm/
Djangoでデータベースを検索するには、ManagerとQuerySetの2つのオブジェクトが必要です。データベースからオブジェクトを検索して、モデルのManageを通じてQuerySetを確立できます。QuerySetはデータベースのオブジェクトとして表現されています。彼は0つ以上のフィルタ条件があります。SQLでQuerySetはselect文をwhereまたはlimitでフィルタします。モデルのManageでQuerySetを取得します。
Manager
Managerの対象は模型類に添付されていますが、特に指定されていない場合は、各モデル類にobject属性があります。このモデルはデータベースで基本的に調べられます。
Managerのいくつかの一般的な方法:
all
:モード内のすべてのデータベース記録を含むQuerySet filter
:指定された条件に適合するモデルレコードを含むQuerySet exclude
:filterとは対照的に、条件に合致しない記録card = Card.objects.filter(pk=offline_card_id).get()
card = Card.objects.exclude(pk=offline_card_id).get()
get
:単一適合条件の記録を取得する(見つかっていないか、またはそれ以上の結果は例外を投げる)order_by
:QuerySetのデフォルトの順序を変更するQuerySet類
QuerySetは動的なキーワードパラメータを受け取り、適切なSQL文に変換してデータベースで実行します。
QuerySetのいくつかの一般的な方法:
distinct
values
values_list
select_related
filter
:指定された条件に適合するモデルレコードを含むQuerySet extra
:結果セット以外のフィールドフィールドフィルタ
フィールド検索はSQL文のWHERE条件を指定する文で、QuerySetを通過する方法です。
filter()
、 exclude()
和 get()
クエリーキーを指定します。フォーマットは:
field__lookuptype=value
。look utypeには以下の種類があります。
gt
: gte
: 大きいものはin
: lt
: lte
: 以下はexact
:iexact
:contains
:クエリーを含み、大文字と小文字を区別するicontains
:大文字と小文字を区別しないstartswith
:マッチング先頭endswith
:マッチング・エンドistartswith
:先頭にマッチし、大文字と小文字を区別しないiendswith
:最後にマッチングし、大文字と小文字を区別しない Extra SQL
extra QuerySet SQL , 。 :
select: select
where: where
tables:
params:
:
queryset.extra(select={' ':'age>18'})
where :
queryset.extra(where=["first like '% %' "])
:
queryset.extra(tables=['myapp_person'])
:
F
, , , ,django F()—— 。
>>> from django.db.models import F
>>> Entry.objects.filter(n_comments__gt=F('n_pingbacks'))
, :
>>> Entry.objects.filter(n_comments__gt=F('n_pingbacks') * 2)
>>> Entry.objects.filter(rating__lt=F('n_comments') + F('n_pingbacks'))
>>>
>>> Entry.objects.filter(authors__name=F('blog__name'))
, timedelta :
>>> from datetime import timedelta
>>> Entry.objects.filter(mod_date__gt=F('pub_date') + timedelta(days=3))
.bitand() .bitor():
>>> F('somefield').bitand(16)
Django pk :
>>> Blog.objects.get(id__exact=14) # Explicit form
>>> Blog.objects.get(id=14) # __exact is implied
>>> Blog.objects.get(pk=14) # pk implies id__exact
pk :
# Get blogs entries with id 1, 4 and 7
>>> Blog.objects.filter(pk__in=[1,4,7])
# Get all blog entries with id > 14
>>> Blog.objects.filter(pk__gt=14)
>>> Entry.objects.filter(blog__id__exact=3) # Explicit form
>>> Entry.objects.filter(blog__id=3) # __exact is implied
>>> Entry.objects.filter(blog__pk=3) # __pk implies __id__exact
Q
QuerySet Q , 。 Q filter exclude 。
:
from django.db.models import Q
Q(question__startswith='What')
& | :
Q(question__startswith='Who') | Q(question__startswith='What')
sql :
WHERE question LIKE 'Who%' OR question LIKE 'What%'
:
Q(question__startswith='Who') | ~Q(pub_date__year=2005)
filter()、exclude()、get() :
Poll.objects.get(
Q(question__startswith='Who'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
sql :
SELECT * from polls WHERE question LIKE 'Who%'
AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
>>>entry = Entry.objects.get(pk=1)
>>>entry.delete()
>>>Blog.objects.all().delete()
>>>Entry.objects.filter(pub_date__year=2005).delete()
, ?
, API 。 。
One-to-many
ForeignKey, :
>>> e = Entry.objects.get(id=2)
>>> e.blog # Returns the related Blog object.
, save() :
>>> e = Entry.objects.get(id=2)
>>> e.blog = some_blog
>>> e.save()
, None, :
>>> e = Entry.objects.get(id=2)
>>> e.blog = None
>>> e.save() # "UPDATE blog_entry SET blog_id = NULL ...;"
:
>>> e = Entry.objects.get(id=2)
>>> print(e.blog) # Hits the database to retrieve the associated Blog.
>>> print(e.blog) # Doesn't hit the database; uses cached version.
select_related() , :
>>> e = Entry.objects.select_related().get(id=2)
>>> print(e.blog) # Doesn't hit the database; uses cached version.
>>> print(e.blog) # Doesn't hit the database; uses cached version.
_set , Blog Entry , Blog Entry :
>>> b = Blog.objects.get(id=1)
>>> b.entry_set.all() # Returns all Entry objects related to Blog.
# b.entry_set is a Manager that returns QuerySets.
>>> b.entry_set.filter(headline__contains='Lennon')
>>> b.entry_set.count()
_set related_name , Entry :
blog = ForeignKey(Blog, related_name='entries')
:
>>> b = Blog.objects.get(id=1)
>>> b.entries.all() # Returns all Entry objects related to Blog.
# b.entries is a Manager that returns QuerySets.
>>> b.entries.filter(headline__contains='Lennon')
>>> b.entries.count()
Many-to-many
e = Entry.objects.get(id=3)
e.authors.all() # Returns all Author objects for this Entry.
e.authors.count()
e.authors.filter(name__contains='John')
a = Author.objects.get(id=5)
a.entry_set.all() # Returns all Entry objects for this Author.
One-to-one
class EntryDetail(models.Model):
entry = models.OneToOneField(Entry)
details = models.TextField()
ed = EntryDetail.objects.get(id=2)
ed.entry # Returns the related Entry object.
:
e = Entry.objects.get(id=2)
e.entrydetail # returns the related EntryDetail object
, DoesNotExist 。
:
e.entrydetail = ed
Making queries
Eclipse django (2)-- (M)
Django:
django orm
記事のURLを参照してください:http://blog.javachen.com/2015/01/15/django-orm/