1. 程式人生 > >17-2 orm單表操作和多表操作

17-2 orm單表操作和多表操作

修改 rst and 默認 div tinc start 去掉 nta

參考:https://www.cnblogs.com/liwenzhou/p/8660826.html

一 ORM單表操作

1 增刪改查

 1 1. 查詢
 2 1. 查所有
 3 models.Publisher.objects.all()
 4 2. 查某個具體的記錄
 5 models.Publisher.objects.get(id=1) --> 註意查詢條件不成立就報錯
 6 2. 刪除一條記錄
 7 models.Publisher.objects.get(id=1).delete()
 8 3. 創建一條記錄
 9 models.Publisher.objects.create(name="
新出版社名字", addr="出版社地址") 10 4. 修改一條記錄 11 obj = models.Publisher.objects.get(id=1) 12 obj.name = "新名字" 13 obj.save()

2 字段和參數:

--1. 字段
  1. CharField 字符類型,必須提供max_length
  2. AutoField int自增
  3. DateField 日期字段

  4. DateTimeField() 日期時間字段
  5. IntergeField() 整數類型
--2. 參數
  1. null=True 可以為空
  2. default=默認值
  3. unique=True 表示是唯一的
--4. 時間字段
  1. auto_now_add=True 創建數據記錄的時候會把當前時間添加到數據庫
  2. auto_add=True 每次更新數據記錄的時候會更新該字段。

3 ORM必知必會單表查詢13條:

		          1. all()		            --> 查詢所有結果
				2. filter()                          --> 根據查詢條件查詢數據庫的
				3. get()                             --> 獲取一個唯一的值
				4. exclude()                         --> 將符合條件的都剔除掉,留下不符合條件的
				5. values(‘字段名‘, ...)             --> 返回一個QuerySet,裏面是字典
				6. values_list(字段名‘, ...)         --> 返回一個QuerySet,裏面是元祖
				7. order_by()                        --> 對查詢結果排序
				8. reverse()                         --> 對一個有序的查詢結果集做反轉
				9. distinct()                        --> 去重,跨表查詢時去掉重復的記錄,MySQL不支持按字段去重
				10. count()                          --> 返回數據條數
				11. first()                          --> 取第一個數據
				12. last()                           --> 取最後一條數據
				13. exists()                         --> 判斷表裏有沒有數據

分類:
1. 返回QuerySet列表的有哪一些?
1. all()
2. filter()
3. exclude()
4. order_by()
5. reverse()
6. distinct()

7. values(‘字段名‘, ...) --> 查詢結果的列表裏,都是字典
8. values_list(字段名‘, ...) --> 查詢結果的列表裏,都是元祖

2. 返回具體對象的
1. first()
2. last()
3. get()

3. 返回數字的
1. count()
4. 返回布爾值
1. exists()

4 單表查詢雙下劃線操作

例子:

 1 models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 獲取id大於1 且 小於10的值
 2  
 3 models.Tb1.objects.filter(id__in=[11, 22, 33])   # 獲取id等於11、22、33的數據
 4 models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
 5  
 6 models.Tb1.objects.filter(name__contains="ven")  # 獲取name字段包含"ven"的
 7 models.Tb1.objects.filter(name__icontains="ven") # icontains大小寫不敏感
 8  
 9 models.Tb1.objects.filter(id__range=[1, 3])      # id範圍是1到3的,等價於SQL的bettwen and
10  
11 類似的還有:startswith,istartswith, endswith, iendswith 
12 
13 date字段還可以:
14 models.Class.objects.filter(first_day__year=2017)

5 如何在一個py文件中 使用Django項目的相關配置或內容,比如之間連接djanjo裏面的數據庫,在新建的py文件裏面寫上下面這個即可:

import os
if __name__ == __main__:
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
    import django
    django.setup()

    from app01 import models

二 ORM跨表操作

正向查詢:

# 查詢第一本書關聯的出版社的名字
# 1. 基於對象的查詢
# book_obj = models.Book.objects.first()
# ret = book_obj.publisher.name
# print(ret)
# 2. 基於queryset的雙下劃線查詢,雙下劃線表示跨表
# ret = models.Book.objects.all().values_list("publisher__name").distinct()
# print(ret)

# 反向查詢

# 1. 由出版社反向查詢書籍(基於對象的查詢)
# publisher_obj = models.Publisher.objects.get(id=2) # 找到張江出版社
# 張江出版社出版的所有書籍
# ret = publisher_obj.book_set.all()
# print(ret)

# 2. 基於queryset的雙下劃線
# 江出版社出版的所有書籍的書名
ret = models.Publisher.objects.filter(id=2).values_list("book__title")
print(ret)

17-2 orm單表操作和多表操作