Django学習ノート---Model
一、データベースの準備
1、使用するデータベースの変更
インスタンスオブジェクトはレコードで、djangoはデフォルトでsqlite 3を使用し、mysqlでプロファイルを変更する必要があります.settingsでDATABASESを変更し、デフォルトではmysqldbを使用します.
2、プロジェクトの__init__ファイルにインポートpymysqlを付けるのは文です
3、ログを印刷して、各ステップの操作のsql文を見ることができて、settingsファイルの中で以下の配置をプラスします
4、model.pyでテーブル情報を作成する
テーブルを作成します.
クラスはテーブルを表し、クラスの各プロパティはテーブルの各フィールドを表します.
モデルでよく使用されるフィールドタイプパラメータ:
Fieldの重要なパラメータ:
外部キーのパラメータ:
複数対複数パラメータ:
結合インデックスを作成するには、次の手順に従います.
1対複数の関係を作成するには、次の手順に従います.
publishは外部キーオブジェクトを表し、publishのデータベース内の名前はpublish_です.id,django自動加算 "_id ".
※: djangoは1.9からForeignKeyのon_deleteパラメータが必要です.topic=models.ForeignKey(Topic,on_delete=models.CADE).
作成が完了したら、次の2つのコマンドを実行します.
二、単表のデータの増加、削除、変更、調査.
追加データ:
関連テーブルを挿入するときの外部キーの挿入方法:
データの変更:
コレクション(queryset)にはupdateメソッドがありますが、インスタンスオブジェクトはなく、インスタンスは直接属性値を変更し、save()を覚えています.
方法1を推奨し、方法2は効率が低い.
データの削除:
テーブルの基本操作:
djangoオリジナルSQL文を書く
ファジイクエリ:
1対の複数クエリー:
複数対複数クエリー:
多対多は、相互粉末の機能に使用される自己関連付けも可能である.
複数対複数の外部キーを作成する必要があります
クエリー:
3番目のテーブルのクエリーについては、オブジェクトのプロパティでのみ値を割り当てることができ、定義された複数の外部キーを操作することで、直接操作することはできません.
マルチペアマルチは、実際には2つの外部キーを含むテーブルです.
複数対と複数対の逆検索について:
逆検索の使用 小文字のクラス名_set のメソッドは、related_nameのプロパティを設定することで、_setのメソッドを使用しなくてもよい
集約関数とグループクエリー:
FクエリーとQクエリー:
※:二重下線はfilter()、values()メソッドでのみ使用できます.他の場所では打点メソッドで属性を呼び出します.
Querysetの特性:
スライスしたり反復したりできます.
不活性評価:
forサイクルの場合:
フロントエンドページにはget_+フィールド名+_displayで、このフィールドのchoice対応の中国語データを直接表示できます.
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 }}