Django ORM

16306 ワード

クエリーオブジェクト
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/