Django学習ノート---Model


一、データベースの準備
1、使用するデータベースの変更
インスタンスオブジェクトはレコードで、djangoはデフォルトでsqlite 3を使用し、mysqlでプロファイルを変更する必要があります.settingsでDATABASESを変更し、デフォルトではmysqldbを使用します.
DATABASES = {
    'default': {

        'ENGINE': 'django.db.backends.mysql', 

        'NAME': 'books',    #       

        'USER': 'root',   #        

        'PASSWORD': '', #       

        'HOST': '', #       ,     localhost

        'PORT': '3306', #       
    }
}

2、プロジェクトの__init__ファイルにインポートpymysqlを付けるのは文です
import pymysql
pymysql.install_as_MySQLdb()

3、ログを印刷して、各ステップの操作のsql文を見ることができて、settingsファイルの中で以下の配置をプラスします
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}  

4、model.pyでテーブル情報を作成する
テーブルを作成します.
クラスはテーブルを表し、クラスの各プロパティはテーブルの各フィールドを表します.
class Book(models.Model):    //         ,  django         
    name = models.CharField(max_length=20)
    price = models.IntegerField()
    author = models.CharField(max_length=20, null=True)  #     ,        

 モデルでよく使用されるフィールドタイプパラメータ:
<1> CharField      #     ,          max_length。  

<2> IntegerField   #        .

<3> FloatField     #      .         :     ,    

<4> AutoField
        #    IntegerField,            .               ; 
        #        :my_id=models.AutoField(primary_key=True)
        #           ,                 model.

 Fieldの重要なパラメータ:
<1> null :             

<2> blank: django  Admin              

<3> default:     

<4> primary_key:    ,      django         :
      id = meta.AutoField('ID', primary_key=True)
      primary_key=True implies blank=False, null=False and unique=True. Only one
      primary key is allowed on an object.

<5> unique:    

<6> verbose_name:   Admin        

<7> db_column:             

<8> choices:   Admin         ,                    , form   choices  ,     。

<9> db_index:                。       。

<10> unique:                   。        ,     。

<11> primary_key:                。        ,     ,    。

<12> editable:  Admin       ,    。

<13> help_text:   Admin         。

<14> error_messages:        (    ),             ;
                     :{'null': "    .", 'invalid': '    '}

<15>  validators:          (    ),           。

外部キーのパラメータ:
to="Author"   to      

to_field="id"        

related_name="b"        .b ,              +_set    related_name     b OK

related_query_name="b"         .b_set,             +_set    related_query_name   b_set

on_delete    #            ,            
      - models.CASCADE,      ,        
      - models.DO_NOTHING,      ,    IntegrityError
      - models.PROTECT,      ,    ProtectedError
      - models.SET_NULL,      ,         null(  FK         )
      - models.SET_DEFAULT,      ,            (  FK         )
      - models.SET(func)  func       。

limit_choice_to  #  Admin ModelForm        ,     
          :limit_choices_to={'nid__gt': 5}

db_constraint=True    #              。        ,              。

複数対複数パラメータ:
to="Author"   to      ,     to_field         。

related_name="b"        .b ,              +_set    related_name     b OK

related_query_name="b"         .b_set,             +_set    related_query_name   b_set

limit_choices_to=None     #  Admin ModelForm        ,     
          :limit_choices_to=Q(nid__gt=10)

through=""              #         ,           ,              ,       。

through_fields={}        #         ,                       
          : through_fields={"u","t"}

symmetrical=True              / false           ,     

db_constraint=True         #              

db_table=""              #          ,        

結合インデックスを作成するには、次の手順に従います.
class Teacher(models.Model):
    name = model.CharField(max_length=8)
    age = model.IntegerField(max_length=8)

    class Meta:   #      
        db_table = "teacher"   #       
        unique_together = [("name","age"),]   #          

1対複数の関係を作成するには、次の手順に従います.
class Book(models.Model):
    name = models.CharField(max_length=20)
    price = models.IntegerField()
    author = models.CharField(max_length=20, null=True)  #     ,        
    publish = models.ForeignKey("Publish", on_delete=models.CASCADE)    //    (  ),     ,       (  )
    //          publish = models.ForeignKey(Publish, on_delete=models.CASCADE),  Publish        。


class Publish(models.Model):
    name = models.CharField(max_length=20)
    city = models.CharField(max_length=10)

publishは外部キーオブジェクトを表し、publishのデータベース内の名前はpublish_です.id,django自動加算  "_id  ". 
※: djangoは1.9からForeignKeyのon_deleteパラメータが必要です.topic=models.ForeignKey(Topic,on_delete=models.CADE).
作成が完了したら、次の2つのコマンドを実行します.
python manage.py makemigrations   

python manage.py migrate

二、単表のデータの増加、削除、変更、調査.
追加データ:
   :
    Book.objects.create(name="PHP", price=99, author="Jax",publish_id=1)

   :
    b = Book(name="PHP", price=99, author="Jax",publish_id=1)
    b.save()  //       ,      

関連テーブルを挿入するときの外部キーの挿入方法:
   :
    Book.objects.create(name="PHP", price=99, author="Jax",publish_id=1)   //        

   :
    pub = Publish.objects.filter(name="Jax")[0]   //       queryset
    Book.objects.create(name="PHP", price=99, author="Jax",publish=pub)  //       

データの変更:
コレクション(queryset)にはupdateメソッドがありますが、インスタンスオブジェクトはなく、インスタンスは直接属性値を変更し、save()を覚えています.
   :
    Book.objects.filter(name="Jax").update(price=100)   //          ,     

   :
    b = Book.objects.get(name="pp")
    b.price=20   //            ,            
    b.save() 

方法1を推奨し、方法2は効率が低い.
データの削除:
Book.objects.filter(name="Jax").delete()

テーブルの基本操作:
Book.objects.filter(  )              ,        ,           。

Book.objects.all()        

Book.objects.first()                   ,    。

Book.objects.last()                   ,    。

Book.objects.get(  )        ,                  。      values  ,           。

Book.objects.values("   ")           ,     ,      queryset  ,           

Book.objects.values_list("   ")           

Book.objects.exclude()    filter     ,        

Book.objects.order_by(  )     

Book.objects.reverse()       ,    order_by  ,  order by   
    # order_by("-id","sid")  reverse     order_by("id","-sid")         (desc)

Book.objects.values("name").distinct()     ,  values()      ,      。

Book.objects.values("name").distinct() .count()    

Book.objects.filter(name="name").extist()          ,           

Book.objects.filter(name="name").iterator()              ,     ,             sql  

Book.objects.all().select_related("c","d")             ,            。
    # select * from book left join author on book.c=auhtor.c and book.d=author.d
    # Book.objects.all() select * from book
    #      select_related  ,         ,         。

Book.objects.all().prefetch_related("c")  #  select_related     ,             
    #        ,  FK      ,            
    #    :SELECT blog_book.id, blog_book.name, blog_book.price, blog_book.author,blog_book.publish_id FROM blog_book
    #    :SELECT blog_publish.id, blog_publish.name, blog_publish.city FROM blog_publish WHERE blog_publish.id IN (1, 2, 3)
    # select_related        ,       

Book.objects.all().only("id","name")     id name     。
    # only values   
    # only   Queryset         ,       。
    # values   Queryset         。
Book.objects.all().defer("id","name")     id name   ,         , only    。

Book.objects.all().using("default")           ,  setting       ,   default。

obj,created = Book.objects.get_or_create(price=81, defaults={"name":".net","price":18})
    #           price     ,       defaults      
    #      ,     ,        。

obj,created = Book.objects.update_or_create(defaults={"name":"ruby","price":111},price=0)
    #    price ,      defaults    。
    #       default          。
 
objs ={
Book(id=10,name="Java",price="998",author="pp",publish_id=1),
Book(id=11,name="ruby",price="996",author="alex",publish_id=2)
}
Book.objects.bulk_create(objs,10)    #        ,10 batch_size         。
#           

djangoオリジナルSQL文を書く
   :   raw  

#             

book_list = Book.objects.all().raw("select * from blog_book") # book_list            
for item in book_list:
    print(item)   #  item      

#         ,           
book_list = Book.objects.all().raw("select id as aid from blog_author")


   :   django     

from django.db import connection,connections

cursor = connection.cursor() #      
# cursor = connnections["default"].cursor()                   
cursor.execute("select * from book")
count = cursor.fetchone()  #        
count1 = cursor.fetchmany(6)  #           
count2= cursor.fetchall()  #       


   :extra     extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)

# Django                WHERE   , extra  ,    filter     
# django          filter   ,    extra         

book_list = Book.objects.fiter(price="100").extra(where={"name=%s"}, param=("python",))

book_list = Book.objects.fiter(price="100").extra(select={"name":"select * from book where name=%s"}, select_param=("python"))

ファジイクエリ:
book_list = Book.objects.filter(name__contains="p")    name     “p”   

book_list = Book.objects.filter(name__icontains="p")   name     “p”   ,      。

book_list = Book.objects.filter(price__gt=100)               100

book_list = Book.objects.filter(price__lt=100)               100

book_list = Book.objects.filter(price__range(90,110))     90--110           between  and

book_list = Book.objects.filter(price__in)                in

book_list = Book.objects.filter(name__startwith="p")   name   p  

book_list = Book.objects.filter(name__endtwith="p")    name   p  

__gte/__lte      /    ,  istartwith/iendwith      /         

book_list = Book.objects.filter(name__isnull = True)         

1対の複数クエリー:
   :       

publish = Publish.objects.filter(id=1)[0]
print(publish.book_set.all().values("name", "price"))     publish     book ,      +_set       。  all() filter()  。

   :         

Book.objects.filter(publish__city="  ").values("name","price")   //     publish  city  。

                 + "__"(    )+                 ,         values  。

複数対複数クエリー:
多対多は、相互粉末の機能に使用される自己関連付けも可能である.
複数対複数の外部キーを作成する必要があります  
auth = models.ManyToManyField("Author")           ,         

クエリー:
obj = Book.objects.get(id=2)
print(obj.auth.all())          queryset,      。

abj = Author.objects.get(id=2)
print(abj.book_set.all())              

3番目のテーブルのクエリーについては、オブジェクトのプロパティでのみ値を割り当てることができ、定義された複数の外部キーを操作することで、直接操作することはできません.
obj = Book.objects.get(id=1)             book_id=1     
abj = Author.objects.get(id=3)           Author_id=3     

          :

    obj.auth.add(abj)                    ,      book_id=1       Author  3   。

          :
    obj.auth.add(1)        obj           book_id=1   Author_id=1    
    obj.auth.add(*[1,2,3])             ,    。


          :

    obj.auth.remove(abj)       ,        book_id=1, Author_id=3   

          
    obj.auth.remove(2)      obj         id 2    

    :
    obj.auth.set([1,2,3])    obj    ,           ,      ,  set              。

    :
    obj.auth.clear()     book_id=1       

      :
    obj.auth.all()           Author   。

マルチペアマルチは、実際には2つの外部キーを含むテーブルです.
複数対と複数対の逆検索について:
逆検索の使用  小文字のクラス名_set  のメソッドは、related_nameのプロパティを設定することで、_setのメソッドを使用しなくてもよい
models.py

class Book(models.Model):
    name = models.CharField(max_length=20, verbose_name="  ")
    publish = models.ForeignKey("Publish", related_name="s", on_delete=models.CASCADE)
    auth = models.ManyToManyField("Author",related_name="ssss")   


class Author(models.Model):
    name = models.CharField(max_length=20)

----------------------------------------------------------------
views.py

   :
Author.objects.get(id=1).s.all()   #        related_name,s          

   :
Author.objects.get(id=1).ssss.all()   #        related_name,ssss            

集約関数とグループクエリー:
from django.db.models import Avg,Count,Sum

aggregate(*args,**kwargs)  
Book.objects.all().aggregate(Avg("price"))      

          :
Book.objects.all().aggregate(book_price=Avg("price"))

annotate(*args,**kwargs)   
Book.objects.values("name").annotate(Sum("price"))      values    name ,  annotate()         

          :
Book.objects.values("name").annotate(sp=Sum("price"))

FクエリーとQクエリー:
     from django.db.models import F,Q

F  :        ,            

Book.objects.all().update(price=F("price")+10)             10

Q  :  "   "    ,         。

" | "    ,"~"   ,"&"   

ret = Book.objects.filter(Q(price=76) | Q(name="python")).values("name")   

ret = Book.objects.filter(Q(price=76) | ~Q(name="python")).values("name")

Q                  ,Q         

※:二重下線はfilter()、values()メソッドでのみ使用できます.他の場所では打点メソッドで属性を呼び出します.
Querysetの特性:
スライスしたり反復したりできます.
不活性評価:
Book.objects.get(id=6)             ,       sql,       ,          。

forサイクルの場合:
ret = Book.objects.filter(id="3")

for item1 in ret:    #    sql
    print(item1)

for item2 in ret:   #     sql,         
    print(item2)

フロントエンドページにはget_+フィールド名+_displayで、このフィールドのchoice対応の中国語データを直接表示できます.
{
    { item.get_status_display }}