Django ORM操做補充

操做補充

only 只取某些去除其餘 

defer 去除某些取其餘

# 需求: 只取某n列
queryset=[ {},{}]
models.User.objects.all().values( 'id','name')

queryset=[ (),()]
models.User.objects.all().values_list( 'id','name')

queryset=[ obj,obj]
result = models.User.objects.all().only('id','name','age')
# result = models.User.objects.all().defer('id','name','age')
for item in reuslt:
print(item.id,item.name,item.age)

selected_related 主動連表查詢 通常這個就夠用了

prefetch_related 進階版連表查詢 最優方案

# 需求: 打印全部用戶姓名以及部門名稱
    class depart:
        title = ....
    class User:
        name = ...
        dp = FK(depart)
    # select * from user
    # result = models.User.objects.all()
    # for item in result:    # 性能低,會跨表 至關於你查10我的就跨表查了10次+原本1次
    # 可是若是連表太多。那性能也會變差,由於表太多了
    #     print(item.name,item.dp.title)

# select * from user left join depart on user.dp_id = depart.id # result = models.User.objects.all().selected_related('dp') # 主動建立了關聯關係。一次查表就能夠拿出來 # for item in result: # 就不會在發請求查詢了,性能更好了 # print(item.name,item.dp.title )
# select * from user # 經過python 代碼獲取 dp_id= [1,2] # select * from depart where id in dp_id result = models.User.objects.all().prefetch_related('dp') for item in result: # 至關於查了兩次。可是不會由於連表太多影響性能了 print(item.name,item.dp.title )

 經過ORM寫偏原生SQL

# - extra
Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])


"""----------------------------------- """


# - raw
    # 執行原生SQL
models.UserInfo.objects.raw('select * from userinfo')
    # 若是SQL是其餘表時,必須將名字設置爲當前UserInfo對象的主鍵列名
models.UserInfo.objects.raw('select id as nid from 其餘表')
    # 爲原生SQL設置參數
models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12,])
    # 指定捆綁條件後跨表查詢
name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)


"""----------------------------------- """


# - 徹底執行原生SQL
from django.db import connection, connections
cursor = connection.cursor()  # cursor = connections['default'].cursor()
cursor.execute("""SELECT * from auth_user where id = %s""", [1])
row = cursor.fetchone() # fetchall()/fetchmany(..)
    # PS: 選擇數據庫 using('default') 默認是  default
queryset = models.Course.objects.using('default').all()

獲取model表名字

model_name = obj.queryset.model._meta.model_name

 

獲取app名字

app_label = obj.queryset.model._meta.app_label

 

 根據字符串取出來每一個model字段對象

title_obj = field_obj._meta.get_field("title")
title_max_length = title.max_length      # 32     # 能夠拿出來字段的屬性對應的值
title.rel.to.objects.all()     # 根據字段對象可取出來映射關聯表的全部內容

values 的本質

循環每一個字段,生成字典 字段爲鍵,查詢的爲值,(字典一個鍵只能有一個值) 所以會有重複數據
用 .distinctu() 去重python

相關文章
相關標籤/搜索