日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Django(四)数据库

發布時間:2025/3/17 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django(四)数据库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、數據庫框架

數據庫框架是數據庫的抽象層,也稱為對象關系映射(Object-Relational Mapper, ORM),它將高層的面向對象操作轉換成低層的數據庫指令,比起直接操作數據庫引擎,ORM極大的提高了易用性。這種轉換會帶來一定的性能損耗,但ORM對生產效率的提升遠遠超過這一丁點兒性能降低。
Django中內置的SQLAlchemy ORM就是一個很好的數據庫框架,它為多種關系型數據庫引擎提供抽象層,比如MySQL, Postgres,SQLite,并且使用相同的面向對象接口。因此,使用SQLAlchemy ORM,不僅能極大的提高生產力,而且可以方便的在多種數據庫之間遷移。

二、配置數據庫

我們可以在項目文件夾的settins.py中配置數據庫引擎。
Django默認使用sqlite:

DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3', # sqlite引擎'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),} }

如果要要使用mysql, 需要進行如下配置:
1 編輯項目文件夾下的settings.py :

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql', # mysql引擎'NAME': 'BookManagement', # 數據庫名稱, 需要通過命令‘CREATE DATABASE BookManagement’在mysql命令窗口中提前創建'USER': 'root', #你的數據庫用戶名'PASSWORD': '***', #你的數據庫密碼'HOST': '', #你的數據庫主機,留空默認為localhost'PORT': '3306', #你的數據庫端口} }

2 編輯項目文件夾下的__init__.py :
由于mysql在Django中默認驅動是MySQLdb, 而該驅動不適用于python3, 因此,我們需要更改驅動為PyMySQL

import pymysqlpymysql.install_as_MySQLdb()

3 顯示SQL語句
前面我們說了ORM將高層的面向對象的操作,轉換為低層的SQL語句,如果想在終端打印對應的SQL語句,可以在setting.py中加上日志記錄:

LOGGING = {'version': 1,'disable_existing_loggers': False,'handlers': {'console':{'level':'DEBUG','class':'logging.StreamHandler',},},'loggers': {'django.db.backends': {'handlers': ['console'],'propagate': True,'level':'DEBUG',},} }

三、模型

在ORM中,用模型(Model)表示數據庫中一張表。模型的具體實現是一個Python類,類中的屬性對應數據庫表中的字段,這個類的實例化對象,對應表中的一條記錄。
總結:類 –> 表; 類屬性 –> 表字段; 類實例 –> 表記錄

定義模型

定義模型就是定義一個python類,以創建一個圖書管理系統為例,基本形式如下:

from django.db import modelsclass Publish(models.Model):name = models.CharField(max_length=60)addr = models.CharField(max_length=60)def __str__(self):return self.nameclass Author(models.Model):name = models.CharField(max_length=30)def __str__(self):return self.nameclass Book(models.Model):name = models.CharField(max_length=60)price = models.DecimalField(max_digits=6, decimal_places=2)publish = models.ForeignKey(Publish)# 定義書與出版社的多對一關系# 默認綁定到Publish表中的主鍵字段authors = models.ManyToManyField(Author)# 定義書與作者的多對多關系,ORM將自動創建多對多關系的第三張表

說明:
1. 定義完模型后,或者修改了模型后,要執行數據庫遷移操作:
python manage.py makemigrations
python manage.py migrate
執行完命令后,查看數據庫的表目錄,可以看到上述表格成功創建:

2. 上述模型中都沒有設置主鍵,在完成上遷移操作后,orm會自動創建主鍵。
3. orm會自動將Book表中的關聯字段publish, 在數據庫中存為publish_id, 所以不要畫蛇添足自己命名為publish_id,否則你在數據庫中看到的是publish_id_id
4. 外鍵引用的主表要么在子表前創建,要么使用字符串形式指定,否則子表找不到主表。
5. 如果我們實例化一個Book對象,book_obj, 那么通過book_obj.publish得到的是publish_id對應的那個Publish對象。這是ORM作的設定,原因很簡單,如果通過book_obj.publish得到只是一個publish_id,對我們并沒有多大用。
6. 雖然不是強制的,但是建議在每個類中定義__str__方法(或__repr__方法),這樣當我們打印對象時,可以顯示具有可讀性的字符串信息,方便調試。
7. 只要在一張表中定義了多對多關系,orm會自動創建實現多對多關系的第三張表。當然,你也可以手動創建,如下:

class BookToAuthor(models.Model):# 手動創建書與作者的多對多關系的第三張表book = models.ForeignKey(Book)author = models.ForeignKey(Author)

還是不建議手動創建,一是麻煩,而是后面我在執行刪除記錄的操作時,提示找不到第三關聯表,可能是我表名命名問題,猜測應該將第三張表命名為Book_authors的格式,這樣才能和orm自動創建的第三張表同名,未驗證。。。

字段類型

類型名Python類型說明
IntegerFieldint普通整數,通常是32位,-2147483648 to 2147483647
SmallIntegerFieldint小整數,一般是16位,-32768 to 32767
BigIntegerFieldint/long64位的整數,-9223372036854775808 to 9223372036854775807
FloatFieldfloat浮點數
DecimalField(max_digits=None, decimal_places=Nonedecimal.Decimal定點數,精度更高;要求指定位數和小數點精度。
CharField(max_length=None)str字符串;要求指定最大長度
TextFieldstr變長字符串
BooleanFieldbool布爾值
DateFielddatetime.date日期,比如:2017-08-25
DateTimeFielddatetime.datetime日期和時間
BinaryFieldstr二進制

更多類型請參考官網 field types

關系字段

字段說明
ForeignKey(othermodel)多對一關系,需要指定關系表
ManyToManyField(othermodel)多對多關系,需要指定關系表
OneToOneField(othermodel)一對一關系,需要指定關系表

字段選項

選項說明
primary_key如果設置primary_key=True, 這列就是表的主鍵;如果不指定,Django會自動添加一個AutoField字段來盛放主鍵,所以我們一般無需設定主鍵。
unique如果設置unique=True, 這列不允許出現重復的值
db_index如果設置db_index=True, 為這列創建索引,提升查詢效率
null如果設置null=True, 這列允許使用空值;如果新增了字段,建議設置該選項,因為新增字段之前的記錄沒有該字段
default為這列定義默認值;如果新增了字段,建議設置該選項,因為新增字段之前的記錄沒有該字段
related_name在一對多關系多所在的表中定義反向引用;這樣在一所在的表中反向查詢多所在的表時,直接用這個字段就行了,可以替代下面要講到的_set反向查詢

更多選項請參考官網 filed options

四、數據庫的操作

下面通過python shell來演示數據庫的操作。在終端切換到項目根目錄下,輸入命令python manage.py shell進入shell操作環境:

增刪改查

1 創建記錄

方式一:實例化

>>> from app.models import Author #導入模型 >>> a = Author(name="張三") # 實例化 >>> a.save() # 插入記錄 >>> print(a) 張三

方式二:create()工廠函數

>>> Author.objects.create(name='李四') <Author: 李四>

通過get_or_create()創建記錄,這種方法可以防止重復(速度稍慢,因為會先查詢數據庫),它返回一個元組,第一個是實例對象(記錄),創建成功返回True,已存在則返回False,不執行創建。

>>> Author.objects.get_or_create(name='李四') (<Author: 李四>, False)

2 查詢記錄

1 Author.objects.all()查詢所有

>>> Author.objects.all() <QuerySet [<Author: 張三>, <Author: 李四>]>

我們也可以對查詢結果進行切片索引操作:Author.objects.all()[start:end:step],注意,不支持負索引:

>>> Author.objects.all()[-1] AssertionError: Negative indexing is not supported.

2 Author.objects.filter(name='李四') 過濾查詢

3 萬能的雙下劃線查詢__,對應SQL的where語句
__contains, __regex, __gt, __th, 多個條件之間以逗號分隔

>>> Author.objects.filter(name__contains='李') # 查詢姓名中包含‘李’的記錄;如果是__icontains則不區分大小寫 <QuerySet [<Author: 李四>, <Author: 李白>]>>>> Author.objects.filter(name__regex=r'^李') #正則查詢,以‘李’開頭的記錄;如果是__iregex則不區分大小寫 <QuerySet [<Author: 李四>, <Author: 李白>]>>>> Author.objects.filter(id__gt=3) # 查詢id大于3的記錄 <QuerySet [<Author: 李白>, <Author: 光緒>, <Author: Martin>]>>>> Author.objects.filter(id__lt=3) # 查詢id小于3的記錄 <QuerySet [<Author: 張三>]>

__in判斷字段在列表內。另外通常用pk指主鍵,不限于id,適用性更好。

models.Server.objects.filter(pk__in=id_list).delete()

其它還有: __startswith(), __istartswith(), __endswith(), __iendswith()
4 Author.objects.get() 只能得到一個對象,多了少了都報錯

>>> Author.objects.get(name='李四') <Author: 李四>

5 first(), last()獲取查詢結果中的單個對象

>>> Author.objects.filter(id__gt=2).first() # 獲取第一個 <Author: 李四> >>> Author.objects.filter(id__gt=2).last() # 獲取最后一個 <Author: Martin>

6 values(*field) 用字典形式,返回指定字段的查詢結果;多個字段間以逗號分隔

>>> Author.objects.values('name') <QuerySet [{'name': '李白'}, {'name': '光緒'}]> # values()方法前可以加過濾條件,如果不加,相當于Author.objects.all().values()

7 values_list(*field),同上,用元組形式

<QuerySet [('李白',), ('光緒',)]>

8 exclude(**kwargs)反向過濾

>>> Author.objects.exclude(name__contains='魯迅') # 過濾所有姓名不包含‘魯迅的’ <QuerySet [<Author: 李白>, <Author: 光緒>, <Author: Martin>]>

9 order_by(*field) 根據字段排序
10 reverse() 反向排序,用在·order_by后面
11 distinct() 剔除重復
12 count() 統計數量
13 exists() QuerySet包含數據返回True, 否則返回False

3 修改記錄

方式一:QuerySet.update(field=var)
修改的前提是先查找,然后調用update(field=val)方法,只有QuerySet集合對象才能調用該方法,也就是說通過get(), first(), last()獲取的對象沒有該方法。

>>> Author.objects.filter(name='李白').update(name='李小白') 1 # 更新了一條記錄 # 對應的SQL語句 UPDATE `app_author` SET `name` = '李小白' WHERE `app_author`.`name` = '李白'; args=('李小白', '李白')

方式二:對象賦值,不推薦,效率低

>>> obj = Author.objects.filter(name='李小白').first() >>> obj.name='李白' >>> obj.save() # SQL語句: UPDATE `app_author` SET `name` = '李白' WHERE `app_author`.`id` = 3; args=('李白', 3) 從SQL語句可以看出,通過對象賦值的方式,會將該對象的所有字段重新賦值,故而效率低。

4 刪除記錄

刪除的前提是先查找,然后調用delete()方法;不同于update()方法,delete()支持QuerySet集合對象的刪除,也支持單個對象的刪除。
delete()默認就是級聯刪除:刪除一條記錄后,在多對多關系的關聯表中與該記錄有關的記錄也會刪除。

>>> Author.objects.filter(id=1).delete() (1, {'app.Book_authors': 0, 'app.Author': 1}) # 該記錄在本表和關聯表中的刪除情況

QuerySet

從數據庫從數據庫查詢出來的結果一般是一個集合,哪怕只有一個對象,這個集合叫QuerySet。
QuerySet特性:
1 支持切片操作
2 可迭代:for循環
3 惰性機制:只有使用QuerySet時,才會走數據庫,比如執行res = Author.objects.all()時,并不會真正執行數據庫查詢,只是翻譯為SQL語句。而當我們執行if res, print res, for obj in res這些操作時,才會執行SQL語句,進行數據庫查詢。這一點可以通過在setting.py中加上日志記錄顯示SQL語句得到證實。
4 緩存機制:每次執行了數據庫查詢后,會將結果放在QuerySet的緩存中,下次再使用QuerySet時,不走數據庫,直接從緩存中拿數據。緩存機制減少了對數據庫的訪問,有利于提高性能。但是一旦數據庫數據更新,除非重新訪問數據庫,否則緩存也不會更新,下面我們來證實這一點:

>>> res = Author.objects.all() >>> for item in res: ... print(item.name) ... 李白 光緒 魯迅 Martin >>> Author.objects.create(name="Susan") <Author: Susan> # 往數據庫插入一條記錄 >>> for item in res: ... print(item.name) ... 李白 光緒 魯迅 Martin # 以上結果可以驗證QuerySet對象的緩存機制,盡管新插入了一條記錄,但打印結果沒變,說明,它不會重新走數據庫,而是從緩存中拿。# 下面我們重新訪問數據庫, 緩存更新,打印出了我們剛剛插入的那條記錄: >>> res = Author.objects.all() >>> for item in res: ... print(item.name) ... 李白 光緒 魯迅 Martin Susan

提高數據庫性能

iterator()迭代器

如果我們查詢出的數據很大,QeurySet的緩存肯定會崩。解決方案:對QeurySet應用.iterator()方法,將查詢結果轉化為迭代器。

>>> g = Author.objects.all().iterator() >>> for item in g: ... print(item.name) ... 李白 光緒 魯迅 Martin Susan >>> for item in g: ... print(item.name) ... >>> # 第一次for循環迭代器迭代完了,所以第二次不會打印出來

盡管轉化為迭代器會節省內存,但是這也意味著,會造成額外的數據庫查詢。

exists()

比如我們拿到一個QuerySet對象,res = Book.objects.all(),想確定記錄是否存在,如果用if res,將會查詢數據庫中的所有記錄,這會極大的影響性能,解決方案:if res.exists() 這樣會限定只查詢一條記錄(低層轉化為SQL語句中的limit 1)

select_related主動連表查詢

提高數據庫性能的關鍵一點是減少對數據庫的查詢,我們來看一個栗子:

1. 創建一張Role角色表,和UserInfo表,建立一對多關系:

from django.db import modelsclass Role(models.Model):title = models.CharField(max_length=32)class UserInfo(models.Model):name = models.CharField(max_length=32)role = models.ForeignKey("Role", null=True)


2.往UserInfo表中插入3個用戶,并指定角色:略

3.在視圖中通過如下方式查詢用戶名和用戶的角色名:

def index(request):user_list = UserInfo.objects.all()for user in user_list:print(user.name, user.role.title)return HttpResponse('ok')

4.在settings.py中配置打印SQL命令;通過瀏覽器訪問http://127.0.0.1:8000/index.html/執行index視圖函數,查看SQL命令的執行結果:

(0.000) SELECT "app01_userinfo"."id", "app01_userinfo"."name", "app01_userinfo"."pwd", "app01_userinfo"."role_id" FROM "app01_userinfo"; args=() (0.000) SELECT "app01_role"."id", "app01_role"."title" FROM "app01_role" WHERE "app01_role"."id" = 1; args=(1,) (0.000) SELECT "app01_role"."id", "app01_role"."title" FROM "app01_role" WHERE "app01_role"."id" = 2; args=(2,) (0.000) SELECT "app01_role"."id", "app01_role"."title" FROM "app01_role" WHERE "app01_role"."id" = 3; args=(3,)

SQL語句顯示一共執行了4次數據庫查詢,第一次對應user_list = UserInfo.objects.all(),剩余三次是for user in user_list: print(user.name, user.role.title) 循環時,針對三個用戶,查詢了三次角色表。如果用戶數量很多,這樣一次次的查詢數據庫,將極大影響數據庫性能。

下面我們通過select_related執行查詢:

def index(request):user_list = UserInfo.objects.all().select_related("role")for user in user_list:print(user.name, user.role.title)return HttpResponse('ok')


查看這次的SQL語句:只執行了一次數據庫查詢

(0.001) SELECT "app01_userinfo"."id", "app01_userinfo"."name", "app01_userinfo"."role_id", "app01_role"."id", "app01_role"."title" FROM "app01_userinfo" LEFT OUTER JOIN "app01_role" ON ("app01_userinfo"."role_id" = "app01_role"."id"); args=()

select_related('FK')取當前表數據和表外鍵關聯字段,因此,在一次查詢中獲得了所有需要的信息。
如果要連多個表,通過雙下劃線連接更多外鍵字段即可:
select_related('FK1__FK2')

prefetch_related

我們將上面的栗子中的select_related改為prefetch_related

def index(request):user_list = UserInfo.objects.all().prefetch_related("role")for user in user_list:print(user.name, user.role.title)return HttpResponse('ok')

查看SQL語句:

(0.000) SELECT "app01_userinfo"."id", "app01_userinfo"."name", "app01_userinfo"."role_id" FROM "app01_userinfo"; args=() (0.001) SELECT "app01_role"."id", "app01_role"."title" FROM "app01_role" WHERE "app01_role"."id" IN (1, 2, 3); args=(1, 2, 3)

執行了兩次查詢,第二次查詢是通過判斷用戶角色是否在角色表,并將關聯的角色取出來。因為通常用戶數量很多,但是角色相對會少很多,因此,這種方式也減少了對數據庫的訪問。

only

UserInfo.objects.all().only("name")

only()方法只取某個字段,因此,如果需要只是需要用到指定的字段,通過這種方式可以提供性能。區別于values(),only()的查詢結果還是對象,而values()的查詢結果是字典。

defer

與only()相反,排除某個字段。

關聯關系的處理

在視圖函數中操作數據庫的語法與在python shell中是一樣的

添加一對多關系

from django.shortcuts import render, HttpResponse from .models import *def add(request):# 方式一,通過真實字段賦值Book.objects.get_or_create(title = 'chinese',price = 10.00,publish_id = 1, # Book的publish字段在數據庫中真實表示是publish_id)# 方式二, 通過對象賦值publish_obj = Publish.objects.get(id=2)Book.objects.create(title ='English',price = 18.88,publish = publish_obj, #通過對象賦值)return HttpResponse('OK')

添加/解除多對多關系

from django.shortcuts import render, HttpResponse from .models import *def add(request):# 添加多對多關系的前提是記錄已經創建好,無法在創建記錄的同時添加多對多關系# 逐個添加 add(obj)author_obj1 = Author.objects.get(id=1)author_obj2 = Author.objects.get(id=2)book_obj = Book.objects.get(id='8')book_obj.authors.add(author_obj2, author_obj1)# 批量添加 add(queryset)author_list = Author.objects.all()book_obj = Book.objects.get(id='1')book_obj.authors.add(*author_list)# * + 列表,將列表傳給函數# * + 字典,將字典傳給函數# 打印authors --> 對象集合book_obj = Book.objects.get(id='8')print(book_obj.authors.all())# 打印結果:<QuerySet [<Author: Egon>, <Author: Alex>, <Author: 魯迅>, <Author: 光緒>]># 解除部分綁定 remove(obj)book_obj = Book.objects.get(id='8')author = Author.objects.get(id=2)book_obj.authors.remove(author)# 如果要解除多個:# * + 列表,將列表傳給函數# * + 字典,將字典傳給函數# 解除所有綁定 clear()book_obj = Book.objects.get(id='8')book_obj.authors.clear()return HttpResponse('OK')

多表查詢

正向查詢:通過當前表中存在的字段查詢

例1:一對多:查詢一本書出版社的名字

>>> b = Book.objects.filter(name__contains='現代').first() >>> b.publish.name # b.publish 是一個對象,對應主表Publish中的一條記錄 '復旦出版' # 通過publish拿到對應主表中的對象,訪問其屬性

例2:多對多:查詢一本書的作者

>>> b = Book.objects.get(name='linux') >>> author_list = b.authors.all() # 拿到某本書的所有author對象 >>> print(author_list) <QuerySet [<Author: 李白>, <Author: 光緒>]>

以上兩例是基于對象屬性的正向查詢。
例3:查詢某出版社出版了哪些書:

>>> pid = Publish.objects.get(name='人民郵電').id >>> book_list = Book.objects.filter(publish_id=pid) # 正向查詢,先拿到出版社id, 然后根據id查詢

反向查詢

Publish表中沒有book相關的字段,但是可以通過反向查詢來做:book_set(用關聯的表名小寫,下劃線加set)來找到與出版社關聯的書籍的對象的集合
還是例3,如果用反向查詢:

>>> pub = Publish.objects.get(name='人民郵電') >>> book_list = pub.book_set.all() >>> print(book_list) <QuerySet [<Book: linux>, <Book: python>]>

book_set : 關聯表名,set集合;all()取出所有數據。
注意,如果是一對一關聯,那么就不用加_set。
基于反向查詢的語法,我們也可以執行反向綁定關系:
偽代碼形式:

a = Author.object.get(..) 拿到作者對象 book_list = ... # 拿到書籍對象的集合 a.book_set.add(*book_list.all()) # 通過反向查詢來增加

基于values(), filter(), 雙下劃線的多表查詢

以上幾種多表查詢方式都略顯麻煩,現在我們通過values(), filter(), 雙下劃線,來簡化一下:
例1:查詢一本書出版社的名字(正向思路):

>>> Book.objects.filter(name='水滸傳').values('publish__name') <QuerySet [{'publish__name': '機械工業'}]> # publish(子表中的關聯字段) + __(雙下劃線) + name(Publish表中的字段) # 對應的SQL語句:valuse("publish__name")應用了表聯結: SELECT `app_publish`.`name` FROM `app_book` INNER JOIN `app_publish` ON (`app_book`.`publi sh_id` = `app_publish`.`id`) WHERE `app_book`.`name` = '水滸傳' LIMIT 21; args=('水滸傳',)

例2: 查詢出版了某本書的的出版社名字(反向思路):

>>> Publish.objects.filter(book__name='linux').values('name') <QuerySet [{'name': '人民郵電'}]> # book(子表名) + __(雙下劃線) + name(子表中的字段) # 對應的低層SQL語句:filter(book__title="linux")應用了表聯結 SELECT `app_publish`.`name` FROM `app_publish` INNER JOIN `app_book` ON (`app_publish`.`id ` = `app_book`.`publish_id`) WHERE `app_book`.`name` = 'linux' LIMIT 21; args=('linux',)

例3:查詢價格大于10的書籍的作者姓名:

正向: Book.objects.filter(price__gt=10).values("authors__name") # authors(子表與主表關聯字段) + __(雙下劃線) + name(主表目標字段) 反向: Author.objects.filter(book__price__gt=10).values("name") # book(子表名) + __(雙下劃線) + price__gt=10(子表字段,條件)

聚合&分組查詢

SQL語言中有聚合函數:Avg, Min, Max, Sum, Count,可以方便進行數據統計;在ORM中,QuerySet的aggregate()方法對此提供了支持,它返回一個統計結果的鍵值對。下面我們看看如何使用,
基本格式:QuerySet.aggregate(func(field))
例1 查詢某作家出版書籍的價格總和

>>> from django.db.models import Avg, Sum, Min, Max, Count # 導入聚合函數 >>> Book.objects.filter(authors__name='魯迅').aggregate(Sum('price')) {'price__sum': Decimal('39.90')} # orm會根據字段和和聚合函數自動拼接鍵,值是聚合值; # 也可以自定義key, 通過如下方式: QuerySet.aggregate('your key' = Sum(field))

如果要統計多個作者,那就要用到分組查詢,QuerySet的anotate()方法對此提供了支持。
例2 每個作者出版過的書的平均價格

>>> from django.db.models import Avg, Sum, Min, Max, Count # 導入聚合函數 >>> Book.objects.values('authors__name').annotate(Avg('price')) # values()根據作者名字進行分組,annotate()顯示分組后的統計結果

F&Q查詢

很多時候單一的關鍵字查詢無法滿足查詢要求,可以使用F&和Q查詢,使用前請先導入:
from django.db.models import F, Q

F對字段取值

F用于取字段取值,我們來看一個例子:
對數據庫中每本書的價格加10元:
Book.objects.all.update(price=price+10)
直接報錯 NameError: name ‘price’ is not defined,提示price+10中的price未定義,取不到值。下面我們通過F對price字段取值:

>>> Book.objects.all().update(price=F('price')+10) # 對應的SQL語句: UPDATE `app_book` SET `price` = (`app_book`.`price` + 10); args=(10,)

Q組合多個查詢條件

假設我們要查詢某個作家,價格大于10元的書,那么filter()函數中通過逗號,放兩個過濾條件可以實現:

>>> Book.objects.filter(authors__name='光緒', price__gt=10) <QuerySet [<Book: linux>, <Book: 現代編程方法>]>

上面這個情況,逗號就是處理邏輯與。那如果要處理邏輯非,邏輯或,這些過濾條件呢?這時Q查詢就可以很靈活處理:
1 將查詢條件用Q包起來
2 通過:, & | ~ 且,或,非,運算符來連接多個過濾條件
下面我們看栗子:
例1 查詢某個作家的,或者價格大于10的書

>>> Book.objects.filter(Q(authors__name='光緒') | Q(price__gt=10)) <QuerySet [<Book: python>, <Book: linux>, <Book: 現代編程方法>, <Book: linux>, <Book: 蘇菲的世界>, <Book: 水滸傳>]> # 光緒寫的,或者價格大于10的書

例2 查詢非莫個作家寫的,并且是某個出版社的書

>>> Book.objects.filter(~Q(authors__name='李白') & Q(publish__name='機械工業')) <QuerySet [<Book: 蘇菲的世界>, <Book: 水滸傳>]> # 不是李白寫的,并且是由機械工業出版社出版的書


Q查詢的面向對象方式

如果查詢條件是一個如下的字典形式:

search_condictions = {'ID': [1, 2], 'hostname': ['c1.com', 'c2.com']}

分析查詢邏輯:

字典中每一個元素下鍵對應的列表中的元素:OR

Q('ID'=1) | Q('ID'=2) Q('hostname'='c1.com') | Q('hostname'='c2.com')

字典中ID與hostname – AND, 最終組合查詢條件如下:

Q((Q('ID'=1) | Q('ID'=2)) & (Q('hostname'='c1.com') | Q('hostname'='c2.com')))


下面我們用Q查詢的面向對象方式:

from django.db.models import Qquery = Q()temp1 = Q() temp1.connector = 'OR' temp1.children.append(('ID', 1)) temp1.children.append(('ID', 2)) # 相當于: # Q('ID'=1) | Q('ID'=2)temp2 = Q() temp2.connector = 'OR' temp2.children.append(('hostname', 'c1.com')) temp2.children.append(('hostname', 'c2.com')) # 相當于: # Q('hostname'='c1.com') | Q('hostname'='c2.com')query.add(temp1, 'AND') query.add(temp2, 'ADN') # 相當于: # Q((Q('ID'=1) | Q('ID'=2)) & (Q('hostname'='c1.com') | Q('hostname'='c2.com')))


當查詢條件長度不確定時,顯然我們無法通過簡單的對Q進行組合來查詢,那么Q查詢的面向對象方式就可以發揮用處:

from django.db.models import Qquery = Q()for k, v in search_condictions.items():# k: AND; for i in v: ORtemp = Q()temp.connector = 'OR'for i in v:temp.children.append((k, i))query.add(temp, 'AND')res = models.Server.objects.filter(query).all()

多表查詢和表創建總結

多表查詢:正向查詢用字段,反向查詢用表名(小寫)

  • 一對一關系:

    # 正向:b_obj = a_obj.field# 反向:因為是一對一,所有查詢出來只有一個,不需要_seta_obj = b_obj.model
  • 一對多關系:

    # 正向:b_obj = a_obj.field# 反向:_set取到集合QuerySet_obj = b_obj.model_set.all()
  • 多對多關系:

    # 正向:QuerySet_obj = a_obj.field.all()# 反向:QuerySet_obj = b_obj.model_set.all()
  • 創建表:

    多表關系的創建

    class Article(models.Model):# 自定義主鍵;一般不需要定義,默認會自己創建。nid = models.BigAutoField(primary_key=True)title = models.CharField(max_length=50, verbose_name='文章標題')# 一對一關系;to_field屬性一般不用定義,orm會自動找到關聯表的主鍵字段body = models.OneToOneField(verbose_name='文章內容', to='ArticleDetail', to_field='nid')# 一對多關系blog = models.ForeignKey(verbose_name='所屬博客', to='Blog', to_field='nid')# 多對多關系;默認自動創建第三張表,通過定義through和through_fields屬性,來手動定義多對多關系。如果需要操作第三張表,選擇手動定義。tags = models.ManyToManyField(to="Tag",through='Article2Tag',through_fields=('article', 'tag'),)# 靜態字段type_choices = [(1, "Python"),(2, "Linux"),(3, "OpenStack"),(4, "GoLang"),]article_type_id = models.IntegerField(choices=type_choices, default=None)# 手動創建多對多關聯表 class Article2Tag(models.Model):nid = models.AutoField(primary_key=True)article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid')tag = models.ForeignKey(verbose_name='標簽', to="Tag", to_field='nid')class Meta:unique_together = [('article', 'tag'),]

    說明:表中出現靜態字段作為choices源的字段,存的值是Integer,如果想獲取對應的文本,使用:

    obj.get_field_display()即可顯示,省去自己寫循環判斷的麻煩。對于這里來說,field是article_type_id

    本表和本表的關系

    自引用一對多

    class Menu(models.Model):"""菜單"""title = models.CharField(verbose_name='菜單名稱', max_length=32, unique=True)parent = models.ForeignKey(verbose_name='父級菜單', to="Menu", null=True, blank=True)# 定義本表的自引用一對多關系# blank=True 意味著在后臺管理中填寫可以為空,根菜單沒有父級菜單 class Customer(models.Model):"""客戶表"""name = models.CharField(verbose_name='姓名', max_length=16)gender_choices = ((1, '男'), (2, '女'))gender = models.SmallIntegerField(verbose_name='性別', choices=gender_choices)referral_from = models.ForeignKey('self', # 與本表的自引用一對多blank=True,null=True,verbose_name="轉介紹自客戶",help_text="若此客戶是轉介紹自內部會員,請在此處選擇會員姓名",related_name="internal_referral")# related_name定義反向引用關系,通過該字段直接查找,而不用反向查找。

    自引用多對多,比如用戶互相關注

    class UserInfo(AbstractUser):"""用戶信息"""nid = models.BigAutoField(primary_key=True)nickname = models.CharField(verbose_name='昵稱', max_length=32)fans = models.ManyToManyField(verbose_name='粉絲們',to='UserInfo',through='UserFans',through_fields=('user', 'follower'))class UserFans(models.Model):"""互粉關系表"""nid = models.AutoField(primary_key=True)user = models.ForeignKey(verbose_name='用戶', to='UserInfo', to_field='nid', related_name='users')follower = models.ForeignKey(verbose_name='粉絲', to='UserInfo', to_field='nid', related_name='followers')class Meta:unique_together = [('user', 'follower'),]

    繼承自帶用戶表

    Django自帶一張用戶表,其中提供了很多字段,包括密文密碼。而用戶自定義的用戶表密碼是明文的,如果需要使用Django自帶用戶表的特性??梢岳^承自帶的用戶表。

  • 配置settings.py

    AUTH_USER_MODEL='app.UserInfo' # app名 加 表名
  • 繼承AbstractUser表后,自帶用戶表中的所有字段可用,并且可以定義其它字段。

    from django.contrib.auth.models import AbstractUserclass UserInfo(AbstractUser):"""用戶信息"""pass
  • 總結

    以上是生活随笔為你收集整理的Django(四)数据库的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    色婷婷国产在线 | 欧美日比视频 | 免费观看第二部31集 | 亚洲欧美一区二区三区孕妇写真 | 四虎在线视频免费观看 | 免费精品视频在线 | 午夜久久福利视频 | 久久免费高清视频 | 四虎国产精品免费观看视频优播 | 91在线播 | 国产亚洲婷婷免费 | 久久男人影院 | 日韩中文字幕视频在线 | 日韩av午夜在线观看 | 久久综合久久综合九色 | 国色天香第二季 | 久久综合九色综合欧美就去吻 | 涩涩网站在线看 | 国产精品免费小视频 | 久久久久在线 | 三级在线国产 | 中文字幕乱码一区二区 | 日韩免费在线观看 | 天天色官网 | 欧美污在线观看 | 日韩av影片在线观看 | 亚洲一级理论片 | 狠狠狠狠狠狠狠狠 | 天天天干夜夜夜操 | 91精品国产一区二区在线观看 | 在线观看免费视频你懂的 | 色视频在线免费观看 | 97成人资源 | 国产一区二区三精品久久久无广告 | 人人爽人人插 | 日本中文字幕在线 | 久99久在线视频 | 免费一级特黄录像 | www久久精品 | 免费成人黄色av | 在线精品视频免费播放 | 欧美人体xx| 天天看天天干 | 91福利视频久久久久 | 久草在线视频资源 | avove黑丝| 91精品黄色 | 久久综合九色综合97婷婷女人 | 一区二区三区中文字幕在线观看 | av大全在线免费观看 | 国产成视频在线观看 | 久久爱资源网 | 中文字幕123区 | 成人欧美亚洲 | 99热99re6国产在线播放 | 亚洲欧美成人网 | 久久99精品久久久久久久久久久久 | 成人黄色电影在线 | 久久少妇免费视频 | 亚洲综合色av | 毛片永久免费 | 日本中文在线播放 | 亚洲在线视频网站 | 91欧美视频网站 | 一级黄色片在线播放 | 美女网站免费福利视频 | 日韩免费视频线观看 | 美女福利视频 | 天天躁日日躁狠狠躁av麻豆 | 激情视频亚洲 | 69国产成人综合久久精品欧美 | 性色av免费在线观看 | 日本色小说视频 | 免费色婷婷 | 国产精品一区二区三区四 | 视频在线观看99 | 欧美欧美| 日韩在线观看视频免费 | 91av在线国产 | 欧美做受高潮1 | 中文字幕婷婷 | 91黄色视屏 | 久久国内视频 | 久草在线视频新 | 国产美女主播精品一区二区三区 | 天天干,天天射,天天操,天天摸 | 亚洲区精品视频 | 碰超人人 | 久久午夜精品影院一区 | 国产精品久久久久永久免费 | 久久精品99视频 | 中文字幕影片免费在线观看 | 久久综合久久综合这里只有精品 | 久草在线免费播放 | 99精品国产在热久久下载 | 亚洲综合丁香 | 在线欧美a | 香蕉视频免费看 | 天天干com| 国内毛片毛片 | 97人人澡人人爽人人模亚洲 | 五月婷婷综合激情 | 99精品国产在热久久下载 | 成人av在线观 | 99精品电影 | 国产一级特黄毛片在线毛片 | 精品一区二区三区久久久 | 国产精品嫩草影院123 | 国产精品久久久久永久免费 | 2021国产精品视频 | 人人插人人干 | 91三级视频 | 久久久 精品 | 日韩二区三区在线观看 | 香蕉影院在线播放 | 午夜视频免费在线观看 | 欧美精品久久久久 | 中文字幕免费高清在线观看 | 免费看色的网站 | 久久国产精品免费一区 | 色偷偷网站视频 | 国产一区网| 久久视频热 | 亚洲精品乱码久久久久久久久久 | 一区二区三区不卡在线 | 国产精品系列在线 | 欧美性色19p| 最新影院 | 美女网站视频色 | www.国产高清 | 美女网站在线 | 在线91精品| 久久无码精品一区二区三区 | 在线天堂中文在线资源网 | 亚洲天堂免费视频 | 91丨九色丨蝌蚪丨老版 | 在线免费观看黄 | 成人中心免费视频 | 在线观看久草 | 日本黄区免费视频观看 | 国产v在线观看 | 国产999精品久久久久久绿帽 | 少妇性bbb搡bbb爽爽爽欧美 | 欧美激情一区不卡 | 中文字幕中文字幕在线中文字幕三区 | 欧美日韩二区三区 | 成人在线视频你懂的 | 91av免费在线观看 | 正在播放国产精品 | 五月婷婷综 | 日本xxxxav | 欧美一区二区三区特黄 | 五月天综合婷婷 | 久久狠狠干 | 国产精品黄色在线观看 | 三级免费黄 | 国产一区二区三区高清播放 | 欧美激情h | 久久亚洲欧美 | 一区二区中文字幕在线播放 | 麻豆网站免费观看 | 午夜精品一区二区三区在线 | 激情综合五月 | 免费在线观看日韩 | 成人在线视频免费观看 | 色搞搞 | 国产激情电影综合在线看 | 精品二区久久 | 亚洲高清在线观看视频 | 欧美伦理电影一区二区 | 在线观看国产永久免费视频 | 亚洲一区免费在线 | 国产成人精品一区二区三区网站观看 | 日韩,中文字幕 | 国产精品久久久久三级 | 一区二区三区 中文字幕 | 在线视频中文字幕一区 | 91av在线免费 | 亚洲视频电影在线 | 99re热精品视频 | 成人影音在线 | 99 精品 在线 | av在线专区 | 夜夜操天天 | 日韩精品一区二区在线 | 福利区在线观看 | 天天操夜夜操 | 亚洲最大成人免费网站 | 中文字幕精品一区 | 在线免费视 | 四虎影视精品永久在线观看 | 国产精品视频全国免费观看 | 三级黄色免费 | 黄色字幕网 | 亚洲一区尤物 | 中文字幕你懂的 | 精品国产一区二区三区久久久蜜臀 | 国产精品久久久久久久久免费看 | 亚洲一区欧美精品 | 一区二区精品视频 | 久色 网 | 成人网在线免费视频 | 日韩高清av在线 | 国产精品视频最多的网站 | 国产麻豆传媒 | 精品久久久久国产 | 免费的国产精品 | 国产精品免费麻豆入口 | 国产精品精品 | 亚洲天堂网在线视频 | 婷婷综合久久 | 日韩电影中文字幕在线观看 | 国产999精品久久久久久麻豆 | 久久亚洲二区 | 亚洲精品高清视频在线观看 | 色综合久久久久久中文网 | 日韩国产在线观看 | 久久tv视频 | 久久超碰免费 | 久久夜夜夜 | 96精品高清视频在线观看软件特色 | 日本中文字幕在线一区 | 中文字幕资源在线观看 | 极品嫩模被强到高潮呻吟91 | 国产 字幕 制服 中文 在线 | 日本中文字幕网址 | 欧美一级特黄高清视频 | 天天玩天天干 | 欧美极度另类 | 国产精品久久久久久久久免费 | 91热视频| 在线激情av电影 | 成人免费看片网址 | 中国老女人日b | 日产av在线播放 | 人人爽人人香蕉 | 麻豆免费精品视频 | 午夜精品久久久99热福利 | 三上悠亚在线免费 | 干干干操操操 | 视频99爱 | 亚洲一区久久久 | 2021国产视频 | 成人免费在线播放 | 麻豆视频免费在线观看 | 日韩激情在线视频 | 日日草天天干 | 天天天天天干 | 欧美一区二区伦理片 | 亚洲黄色在线 | 91免费观看视频网站 | 97超碰人人干 | 国产成人av网 | 日韩黄色在线观看 | 国产亚洲精品久久19p | 日韩一三区 | 日本黄色免费播放 | 久久成人免费视频 | 91精品爽啪蜜夜国产在线播放 | 免费观看视频黄 | 免费观看视频的网站 | 欧美a级成人淫片免费看 | 国内精品视频在线播放 | 天天碰天天操 | 久久1电影院 | 亚洲日本黄色 | 免费观看黄色12片一级视频 | 日本精a在线观看 | 日韩二区在线 | 天天射天天射天天射 | www黄| 久久久www成人免费毛片麻豆 | 国产黄色美女 | 婷婷丁香九月 | 91香蕉视频色版 | 日韩黄色免费看 | 国产精品自在欧美一区 | 韩国中文三级 | 亚洲国产天堂av | 欧美日韩不卡在线视频 | 国产专区视频在线 | 人人爽久久涩噜噜噜网站 | 国产精品久久久久久久久久久久午夜片 | 91你懂的 | 国产成人av | 99热手机在线 | 久草在线观看 | 97超碰人人模人人人爽人人爱 | av不卡中文字幕 | 成人午夜免费福利 | 99精品视频在线观看播放 | 日韩一区二区免费播放 | 91av九色| 欧美日韩一区二区久久 | 最近日韩免费视频 | 久久久亚洲精华液 | 久久久久久国产精品免费 | 久久久久久久久久电影 | 国产精品久久久777 成人手机在线视频 | 亚洲激情国产精品 | av一本久道久久波多野结衣 | 久久网址 | 中文字幕久久久精品 | av无限看| 亚洲第一成网站 | 99热在线网站| 超碰97免费观看 | 欧美日高清视频 | 欧美网址在线观看 | 免费看久久久 | 国产精品成人一区二区三区 | 久99久中文字幕在线 | 国产乱老熟视频网88av | 日韩精品中文字幕在线观看 | 久草在线观看资源 | 色欲综合视频天天天 | 日本精品视频在线 | 嫩草av在线 | 亚洲视频在线播放 | 黄色av一区二区 | 久久99亚洲精品久久 | 一性一交视频 | 超碰日韩 | 国产精品五月天 | 免费在线观看黄网站 | 五月天久久激情 | 亚洲一区二区精品视频 | 欧美91成人网 | 婷婷日韩 | 91看片成人 | 亚洲一级影院 | 激情视频一区二区三区 | 精品主播网红福利资源观看 | 精品久久久久久久久久国产 | 亚洲精品午夜视频 | 国产精品18久久久久久不卡孕妇 | 久久免费精彩视频 | 91精品国产电影 | 999抗病毒口服液 | 国产精品自在欧美一区 | 天天射色综合 | 日韩区欠美精品av视频 | 天天色天天草天天射 | 一区二区三区精品久久久 | 国产一区二区三区视频在线 | 天天色影院 | 久久国产精彩视频 | 综合网中文字幕 | 欧美日韩一区二区三区视频 | 成人免费观看视频大全 | 国产一区二区在线播放视频 | 九九久久电影 | 中文字幕高清有码 | 国产免费精彩视频 | 91成人在线免费观看 | 成人午夜电影在线播放 | 欧日韩在线视频 | 狠狠色丁香婷婷综合久小说久 | 日韩专区 在线 | 黄色小网站在线 | 8x成人在线 | 午夜精品久久久久久久99无限制 | 一区二区免费不卡在线 | 天天操天 | 久久成人国产精品一区二区 | 天天干天天拍天天操天天拍 | 米奇狠狠狠888| 一区在线电影 | 欧美日韩一区久久 | 欧美少妇xxx | 亚洲欧美视频网站 | www.色午夜 | 国产无限资源在线观看 | 久久久亚洲精华液 | 国产手机在线精品 | 国产精品免费视频久久久 | 亚洲成人av电影 | 狠狠插天天干 | 深夜国产在线 | 日韩一区二区免费播放 | 国产精品18久久久久vr手机版特色 | 国精产品永久999 | 日韩欧美黄色网址 | 麻豆国产电影 | 日韩av女优视频 | 69国产盗摄一区二区三区五区 | 久久久国产精品视频 | 欧美精品九九99久久 | 亚洲网站在线看 | 中文字幕高清在线 | 人人干狠狠干 | 亚洲精品视频在线 | 欧美一级特黄aaaaaa大片在线观看 | 国产色 在线 | 开心婷婷色 | 天天弄天天干 | 精品人妖videos欧美人妖 | 97超级碰碰碰视频在线观看 | 国产精美视频 | 国产精品久久久久久五月尺 | 天天操天天操天天操天天 | 成年人黄色免费网站 | 亚洲va在线va天堂va偷拍 | 精品人人人人 | 日韩欧美69| 久久96 | 免费在线观看av不卡 | 国产精品手机在线 | 久久久精品午夜 | 天天摸夜夜操 | 91成人网页版 | 永久免费观看视频 | 日日夜夜av| 成人av免费| 国产精品自产拍在线观看桃花 | 狠狠干夜夜操 | 一区 二区电影免费在线观看 | 色综合久久天天 | 九九久久久久99精品 | 色综合在| av成人免费观看 | www.福利 | 日韩一区二区免费在线观看 | 久久网站av| 99c视频在线 | 国产不卡一二三区 | 国产黑丝一区二区 | 国产黄色免费在线观看 | 成人午夜精品久久久久久久3d | 久久中文字幕在线视频 | 99精品国产在热久久 | 又湿又紧又大又爽a视频国产 | 国产黄色免费 | 亚洲jizzjizz日本少妇 | 日韩一级电影在线 | 97成人免费 | 国产美女精品人人做人人爽 | 欧美a免费 | 国产成人久久精品一区二区三区 | 国产亚洲精品久久久久动 | 色婷婷亚洲精品 | a v在线观看 | 激情伊人五月天 | 日本中文字幕影院 | 欧美性色黄 | 国产视频在| 国产高清一区二区 | 久久久久亚洲a | 日韩中文字幕免费视频 | 国产999视频在线观看 | 久久久久久毛片 | 91免费网站在线观看 | 97国产一区二区 | 久久久久成人精品 | 久久亚洲区 | 久久久久亚洲精品中文字幕 | 精品综合久久 | 国产在线观看黄 | 黄色精品一区 | 日日躁你夜夜躁你av蜜 | 久久av影视 | 九九热精品视频在线观看 | 狠狠色丁香久久综合网 | 日韩剧情 | 在线观看网站你懂的 | 天天躁日日 | 精品国产精品久久一区免费式 | 最近日本韩国中文字幕 | 欧洲激情在线 | 午夜精品一区二区三区视频免费看 | 天堂av免费看 | 国产精品欧美激情在线观看 | 肉色欧美久久久久久久免费看 | 久热久草| www.97视频| 最近日本mv字幕免费观看 | 国精产品满18岁在线 | 国产中文字幕91 | 日本三级不卡视频 | 日韩免费三区 | 日日夜夜干 | 欧美日韩在线观看视频 | 欧美a在线免费观看 | 亚洲做受高潮欧美裸体 | 久久久黄视频 | 久久激情综合网 | 亚洲成av人片在线观看香蕉 | 久久99久久久久 | 久久不卡日韩美女 | 色婷婷亚洲综合 | 综合天堂av久久久久久久 | 嫩草av影院| 日本久久久影视 | 国产在线1区 | 久久久久久久免费观看 | 国产精品一区二区三区在线播放 | 极品美女被弄高潮视频网站 | 五月激情站 | 亚洲色图27p | 西西www444 | 久草在线久草在线2 | www.国产视频 | 欧美-第1页-屁屁影院 | 精品国产亚洲一区二区麻豆 | 国内揄拍国产精品 | 色在线免费观看 | 91av欧美| 在线国产日韩 | 国产视频在线看 | 国产视频 亚洲精品 | 精品国产一区二区三区免费 | 久久国产热 | 精品国产乱码久久久久久1区2匹 | 在线观看一级视频 | 韩国精品福利一区二区三区 | 中文字幕一区二区在线播放 | 国产成人综合精品 | 日批网站在线观看 | 久久久久久久久久久电影 | 天天超碰 | 中文字幕免费国产精品 | 91免费高清在线观看 | 久久免费视频7 | 天天操天天干天天玩 | 久草在线电影网 | 成人精品在线 | 国产日韩精品一区二区在线观看播放 | 国产一区二区三区高清播放 | 美女网站免费福利视频 | 在线不卡中文字幕播放 | 日韩国产欧美在线播放 | 中文字幕在线观看视频免费 | 成人精品999 | 操操日| 精品国产乱码久久久久久1区2匹 | 免费高清在线观看电视网站 | 激情开心站 | 久久精久久精 | 99精彩视频在线观看免费 | 亚洲人成人天堂h久久 | 人人干网| 在线观看中文字幕一区二区 | 国产麻豆精品一区二区 | 最新在线你懂的 | 在线观看av中文字幕 | 337p日本欧洲亚洲大胆裸体艺术 | 亚洲精品免费在线视频 | 亚洲最大激情中文字幕 | 最近中文字幕在线中文高清版 | 天天色天天干天天 | 亚洲一级黄色片 | 五月天婷婷在线播放 | 在线观看av网 | 操天天操 | 国产精品18久久久久久首页狼 | 亚洲成人av免费 | 91亚洲国产 | 999在线精品 | 高清一区二区三区 | 久久精品欧美日韩精品 | 四虎国产视频 | 91片网| 久久亚洲免费视频 | 久久免费视频在线 | 久久精品国产一区二区 | 狠狠躁日日躁狂躁夜夜躁 | 免费日韩精品 | 99精品黄色片免费大全 | 久久久久五月天 | 日本中文字幕在线一区 | 日韩在线视频网 | 丁香综合网 | 国产粉嫩在线观看 | 婷婷久月 | 中文字幕在线播放日韩 | 91精品国产九九九久久久亚洲 | 999亚洲国产996395 | 精品影院一区二区久久久 | 久久久久久久久久久电影 | 国产精品美女在线 | a在线观看国产 | 亚洲 欧美 日韩 综合 | 又粗又长又大又爽又黄少妇毛片 | 亚洲a资源 | 成人97人人超碰人人99 | 成人综合婷婷国产精品久久免费 | 91在线国产观看 | 九九视频精品免费 | 91国内产香蕉 | 在线视频精品 | a在线视频v视频 | 国产一区免费观看 | 日韩欧美一区二区在线观看 | 深夜免费小视频 | 91麻豆精品| 国产精品美女久久久久久久久久久 | 日日日爽爽爽 | 亚洲无在线 | 少妇bbw揉bbb欧美 | 日韩精品在线视频 | 久久九九免费视频 | 91av看片 | 五月天天av| 香蕉视频一级 | 国产1区2区3区精品美女 | 精品亚洲男同gayvideo网站 | 麻豆视频在线观看免费 | 超碰在线97免费 | 免费观看性生活大片 | 在线免费观看羞羞视频 | 久久亚洲视频 | 天天久久夜夜 | 日韩精品中文字幕一区二区 | 国产精品久久久久久久久久久不卡 | 亚洲国产日韩欧美 | 免费开视频| 国产九九热 | 91精品视频免费 | 黄色小说在线免费观看 | 毛片一二区 | 91黄色小网站 | 亚洲精品久久久久58 | 色综合久久综合中文综合网 | 国产精品毛片一区视频播不卡 | 免费看国产曰批40分钟 | 91免费视频黄 | 黄a网站 | 97人人模人人爽人人喊中文字 | 精品久久久久久国产91 | 久久精品视频一 | 激情综合电影网 | 久久综合色一综合色88 | 国产一级一级国产 | 91精品国产欧美一区二区成人 | 少妇超碰在线 | 欧美日韩中文字幕在线视频 | 不卡的av在线 | 日韩欧美一区二区三区免费观看 | 国产一区免费视频 | 日韩va欧美va亚洲va久久 | 日韩在线网址 | 国产 中文 日韩 欧美 | 国产精品久久久久久av | 欧美最新另类人妖 | 综合天天网| 国产亚洲精品xxoo | 在线国产欧美 | 成人免费看片98欧美 | 国产精品视频全国免费观看 | 精品美女久久久久久免费 | 天天色天天干天天 | 99久久爱| 一区二区三区四区不卡 | 亚洲精品激情 | 精品一区二三区 | 日韩一三区 | 亚洲精品777 | 国产精品亚洲片在线播放 | 精品乱码一区二区三四区 | 久久精品91久久久久久再现 | 国产精品久久久久久久久久久久午 | 成av人电影 | 天堂av在线网站 | 久久精品精品 | 免费网站色 | 四虎国产精品免费观看视频优播 | 日韩欧美在线国产 | 国产69精品久久99的直播节目 | 久久精品国产亚洲a | 黄色成年片 | 国产精品视频专区 | 成人 亚洲 欧美 | 亚洲日本va午夜在线电影 | 99精品久久久久久久久久综合 | 夜夜操天天 | 2019中文在线观看 | 久久99深爱久久99精品 | 免费在线播放av电影 | 手机成人在线电影 | 欧美尹人 | 黄色在线免费观看网站 | 中文字幕一区二区三区四区视频 | 久久久久久久久久久久影院 | 人人澡超碰碰97碰碰碰软件 | 玖草在线观看 | 在线а√天堂中文官网 | 欧美人牲 | 久久高清国产视频 | 国产视频2区 | www色av| 精品一二三四五区 | 一级精品视频在线观看宜春院 | 中文字幕国产视频 | 国产一级片网站 | 中文字幕人成不卡一区 | 成年人免费看片 | 最近中文字幕免费观看 | 中文字幕一区二区在线观看 | 久久综合久久综合久久 | 在线免费性生活片 | 久久久久综合精品福利啪啪 | 国内精品免费久久影院 | 五月婷婷中文字幕 | 97韩国电影| 精品国产一区二区三区免费 | 久久有精品 | 97精品国产| 久久 在线 | 国产精品久久99 | 国产96在线观看 | 激情欧美xxxx | 91大神免费视频 | 永久免费在线 | 久久精品在线免费观看 | 在线天堂v | 久久国产二区 | 色婷婷综合在线 | 日韩精品一卡 | 在线观看韩日电影免费 | 国产美女视频网站 | 一级大片在线观看 | 91亚洲视频在线观看 | 亚洲在线视频网站 | 国产日韩在线看 | 91精品国自产在线观看欧美 | 韩国av电影网 | 在线国产专区 | 久久视频网址 | av在线免费播放网站 | 国产一区在线不卡 | 激情亚洲综合在线 | 丁香激情综合久久伊人久久 | aav在线 | 成人黄色大片在线免费观看 | 久久伊人爱 | 1024手机基地在线观看 | 精品国产成人av | av免费在线免费观看 | 一本一本久久a久久精品综合小说 | a在线一区 | 欧美精品久久久久久久久久白贞 | www激情网 | 久久黄色免费观看 | 亚洲日本成人网 | 色播五月激情综合网 | 久久免费视频2 | 狠狠色丁香婷婷综合久小说久 | 九九精品视频在线看 | 色婷婷狠狠五月综合天色拍 | 成人全视频免费观看在线看 | 超碰97在线资源 | 免费福利在线视频 | 99久久精品日本一区二区免费 | 久久久久久蜜av免费网站 | www.综合网.com| 欧美亚洲一区二区在线 | 国产91精品久久久久久 | 天天射天天搞 | 国产成人精品一区二区三区福利 | 永久av免费在线观看 | 久久国产高清 | 亚洲成人精品国产 | 国产精品久久久久久久久久久杏吧 | 在线看国产视频 | 五月婷婷天堂 | 一区二区三区久久 | 又大又硬又黄又爽视频在线观看 | 亚洲另类在线视频 | 日韩区视频 | 久久久精品免费看 | 久久中文字幕在线视频 | 亚洲国内在线 | 91亚洲精品在线 | 国产精品一区在线 | 国产色影院 | 日韩伦理片hd| 中文字幕资源站 | 国产高清视频在线免费观看 | 久久天天拍 | 国产精品久久婷婷六月丁香 | 天天色图 | av在线电影网站 | 日韩黄色免费看 | 成年人app网址 | 在线国产精品视频 | 在线观看中文字幕 | 久久精品一区二区三区视频 | 黄色软件视频大全免费下载 | 午夜一级免费电影 | 在线视频国产区 | 天天干天天操天天干 | 久久不射电影院 | 九九热精品在线 | 69av视频在线观看 | 国产精品美女久久 | 日韩中文字幕视频在线观看 | 97在线精品国自产拍中文 | 麻豆视频免费在线观看 | av天天在线观看 | 成人黄色片在线播放 | 中文字幕在线播放av | 黄色片免费电影 | 婷婷综合五月天 | 亚洲午夜久久久综合37日本 | av解说在线观看 | 69视频在线| 亚洲精品99 | 日韩二区精品 | 黄色毛片在线 | 五月婷婷丁香在线观看 | 日韩午夜视频在线观看 | 日韩激情视频 | 麻豆mv在线观看 | 在线日韩一区 | 久久99热久久99精品 | 香蕉成人在线视频 | 人人爽夜夜爽 | 久久久国际精品 | 欧美一级特黄aaaaaa大片在线观看 | 久久久久久高清 | 久久视频在线免费观看 | 麻豆精品传媒视频 | 色综合婷婷 | 欧美一级小视频 | 色婷婷六月| 免费国产ww | 激情久久综合 | 超碰电影在线观看 | 国产精品毛片久久久久久久 | 久久久久久免费网 | 97超碰在线视 | 亚洲四虎影院 | 国产91aaa| 国产永久免费高清在线观看视频 | 久久精品影片 | 国产超碰在线 | 色欧美88888久久久久久影院 | 国产精品久久久久一区二区三区共 | 99免费看片 | 国产xvideos免费视频播放 | 九九在线国产视频 | 一区二区影视 | 精品视频免费观看 | 99中文字幕视频 | 欧美一级片在线播放 | 婷婷天天色| 四虎在线观看精品视频 | 欧美日韩午夜爽爽 | 国产高清第一页 | 成人小视频在线 | 日韩欧美精品一区二区三区经典 | 久久av观看 | 999久久久久久久久 69av视频在线观看 | 久久综合狠狠综合久久综合88 | 国产精品久久久av | 亚洲精品乱码久久久久久蜜桃不爽 | 久久艹精品 | 五月在线 | 天天干,天天草 | 婷婷在线综合 | 国产最顶级的黄色片在线免费观看 | 四虎国产永久在线精品 | 精品国产久 | 天天操天天爱天天爽 | 六月丁香综合 | 亚洲国产视频网站 | 公与妇乱理三级xxx 在线观看视频在线观看 | 国产精品久久久久久久久久妇女 | 婷婷国产在线 | 色天天综合久久久久综合片 | a天堂最新版中文在线地址 久久99久久精品国产 | 麻豆一二 | 国产精品久久网站 | 一本一本久久a久久精品牛牛影视 | 天天操天天色天天 | 日韩精品中文字幕在线 | 亚洲精品国偷拍自产在线观看 | 欧美性视频网站 | 91欧美精品 | 亚洲精品在线观看不卡 | 国产精品12| 国产韩国日本高清视频 | 亚洲高清视频在线观看免费 | 99c视频在线 | 久久久精品成人 | 精品国产91亚洲一区二区三区www | 亚洲精品影院在线观看 | 免费av的网站 | 美女免费视频网站 | 国产精品嫩草在线 | 天天操天天射天天插 | 丁香六月av| 亚洲国产中文在线观看 | 亚洲色图色 | 欧美成人高清 | 午夜视频在线瓜伦 | 日日综合 | 欧美专区日韩专区 | 欧美日韩免费观看一区二区三区 | 亚洲精品视频在线观看视频 | 久久久一本精品99久久精品66 | 国产99久久久久 | 久久久久久国产精品免费 | 天天综合网入口 | 国产精品成人自产拍在线观看 | 国产高清一 | 黄色av电影在线观看 | se婷婷| 91麻豆精品一区二区三区 | www.亚洲激情.com | 色婷婷综合久久久中文字幕 | 欧美日韩国产一区二区三区在线观看 | 人人爽人人爽人人爽学生一级 | 91成人看片| 日韩av电影中文字幕 | 天天做综合网 | 日韩二区三区 | 午夜999 | 免费在线播放av电影 | 久久精品中文字幕一区二区三区 | 国产免费观看久久黄 | 国产丝袜高跟 | 精品国产乱码久久久久久天美 | 欧美黑吊大战白妞欧美 | 人人爽人人做 | 毛片网站在线观看 | 亚洲精品男人天堂 | 免费看黄的视频 | 亚洲va韩国va欧美va精四季 | 久草在线观 | 精品久久久久久亚洲综合网站 | 四虎影视成人 | 精品国产一区二区三区久久久蜜月 | 美女黄网久久 | 9在线观看免费高清完整 | 日韩大片在线 | 成年人免费在线观看网站 | 成人精品久久久 | 中文字幕欧美日韩va免费视频 | 亚洲精品在线二区 | 国产精品免费在线视频 | 国产成人精品国内自产拍免费看 | 久操久 | 97国产大学生情侣酒店的特点 | 少妇高潮冒白浆 | www色综合| 精品国产乱子伦一区二区 | 中文免费在线观看 | 国内精品99| 亚洲欧美一区二区三区孕妇写真 | 在线观看一区 | 国产成人在线网站 | 2019天天干夜夜操 | 欧美成人精品欧美一级乱黄 | 超碰夜夜 | 九九九热精品 | 四川bbb搡bbb爽爽视频 | 最新中文字幕在线播放 | 国产精品美女 | 91av手机在线观看 | 久久伊人热 | 国产精品大片免费观看 | 热久久99这里有精品 | 日本一区二区免费在线观看 | 日本久草电影 | 久久精品久久99 | 成人免费视频视频在线观看 免费 | 国产专区在线视频 | 亚洲精品国产成人av在线 | 亚洲九九九在线观看 | 国产在线观看99 | 97视频免费观看2区 亚洲视屏 | 成人免费中文字幕 | 亚洲精品国产区 | 色婷婷久久一区二区 | 免费看av片网站 | 日韩影视在线观看 | 正在播放国产一区 | 久久精品国产v日韩v亚洲 | 麻豆视频国产 | 91精品久久久久久综合乱菊 | 欧美婷婷色| 色综合久久久久久久久五月 | 免费视频97| 最新中文字幕在线播放 | 日韩欧美一区二区在线 | 免费高清无人区完整版 | 婷婷激情影院 | 日韩精选在线观看 | 正在播放国产精品 | 一区二区三区播放 | 中文字幕一区二区三区四区在线视频 | 国产精品第7页 | 日韩精品中文字幕av | 国产又粗又猛又黄视频 | 成人黄性视频 | 99久久精品国产免费看不卡 | 日韩精品视频免费在线观看 |