django orm查詢和後端緩存的使用

django orm 查詢

1 字段後(db_column='age')
(null=True)#表示數據庫裏面的該字段數據能夠爲空
(blank=True)#表示前端表單提交的時候能夠爲空
(db_index=True)#表示給該字段創建索引
(help_test='這個事說明')#提示說明
(editable=False) #表示這個字段內容不能被編輯
(unique_for_date=True)#表示日期必須惟一
(unique_for_month=True)#表示月份必須惟一
(auto_now_add=True)#自動生成新插入的日期時間
(auto_now=True) # 表示字段信息更新的時間


#浮點型字段中
Decimal=models.DecimalField(max_digits=4,decimal_places=2)#最大長度和小數位數

#外鍵字段中on_delete
'''
on_delete當一個外檢關聯的對象被刪除時,django將模仿on_delete參數定義的SQL約束執行相應操做
    以下6中操做
    CASCADE:模擬SQL語言中的ON_DELETE CASCADE約束,將定義有外檢的模型對象同時刪除!(該操做爲當前django版本的默認操做)
    SET_NULL:阻止上面的刪除操做,可是彈出ProtectedError異常
    SET_DEFAULT:將外檢字段設爲默認值,只有當字段設置了default參數是,方可以使用
    DO_NOTHING:什麼也不作
    SET():設置一個傳遞給SET()的值或者一個回調函數的返回值,注意大小寫
'''
2 #定義元數據
class AddressInfo(models.Model):
    assress=models.CharField(max_length=200)
    pid=models.ForeightKey('self',null=True,blank=True,verbose_name='自關聯')
    def __str__(self):
        return self.address
    class Meta:#元數據
        
        db_table='cc_address'
        #ordering = ['pid']#根據pid排序
        verbose_name='這是註釋'
        verbose_name_plural = verbose_name    
        #abstrace = True #將該模型類設置爲一個基類,供其餘模型類調用
        #permissions = (('定義好的權限','權限說明'))
        #manage = False
        unique_together = ('address','note') #聯合惟一
        #app_labe; = 'customer'#表示該表屬於哪一個應用
        #db_tablespace #定義數據庫表空間的名字
        
    3 #字段的枚舉類型 
    
        type=models.CharField(choices=((1,'實戰課'),(2,'免費課'),(3,'其餘')),max_length=1)
        
        
    4 #設置外鍵
        #多對一的狀況下,在多的表中
        teacher = models.ForeightKey(Teacher,on_delete = models.CASCADE,verbose_name = '課程講師')#           爲了級聯刪除
        #多對多的狀況下,在少的表中
        course=models.ManyToManyField(Course,verbose_name='課程')
    
    5 #數據庫同步命令
        (1)生成數據庫要執行的內容
        python3 manage.py makemigrations
        (2)執行生成的文件,同步到數據庫
        python3 manage.py migrate
    
    6#在模型類中刪除一個表格順序
        (1)刪除模型類中的代碼
        (2):刪除模型類在mogrations下生成的對應文件
        (3):刪除django_migrarions對應的生成記錄
        (4):刪除咱們的數據表
            
            
            
            
            
    7 #django數據導入
       (1) 在cmd項目當前目錄下執行#python3 manage.py shell
    eg:from customer.models import Teacher
        t = Teacher(nickname='andy')
        t.save()
    (2):經過腳本導入
    (3):python3 manage.py dumpdata>imooc.json#導出數據
        python3 manage.py loaddata imooc.json#導入數據
   
   8 #Models API
    class IndexView(View):
        def get(self,request):
            #1.查詢.檢索.過濾
            teachers=Teacher.objects.all() #查詢集
            teacher2 = Teacher.objects.get(nickname='jack') # get()只能但會一條結果,多條則會報錯
            teacher1 = Teacher.objects.filter() #QuerSet,能夠多條結果
            for t in teacher3:
                print(f"講師姓名{t.nickname}--粉絲數{t.fans}")
            #2 字段數據匹配,大小寫敏感
            teacher5 = Teacher.objects.filter(nickname__icontains='A')#大小寫敏感
            print(teacher5)
            teacher6 = Teacher.objects.all().order_by('-fans')#按照粉絲倒敘排列
            for t in teacher6:
                print(t.fans)
            print(Teacher.objects.filter(fnas__gte=500).order_by('nickname'))
            #4 查看執行的原生SQL
            print(str(xx.query))
            
            
    9 #返回新的QuerySet的API:去重,排序,使用聚合計數,求和,平均數,反向查詢
       print(Student.objects.all().exclude(nickname='A同窗'))#去除查詢結果中nickname='A同窗'的數據 
           .exclude#去除某一條符合條件的數據
        .revers()#反向排序--注意:必定要在元數據中寫ordering = ['age']
        .extra()#去重
        .defer():#排除一些字段
        .only() # 選擇一些字段
       s3 = Student.objects.all().extra(select = {'name':'nickname'})
        for s in s3:
            print(s.name)
       student.objects.all().only('nickname','age').query--值查詢執行的兩個字段
        (3):values(),values_list 獲取字典或者元祖形式的QuerySet
            Teacher.objects.values('nickname','hobby')#字典形式
            Teacher.objects.values_list('nickname','hobby')#元組形式
            Teacher.objects.values_list('nickname',flat=True)#取一條數據的時候,使用flat=Tru能夠實現拿到列表
        (4):dates(),datetimes() 根據時間日期獲取查詢集
            
        (5):union(),intersection(),difference() 並集,交集,差集
            
        (6)select_related() 一對一,多對一查詢優化,prefetch_related() 一對多,多對多查詢優化;反向查詢
        
    (7) .annotate()使用聚合計數,求和,平均數, raw() 執行原生的sql    
        Course.objects.values('teacher').annotate(vol=Sum('volume'))#求和
        Course.objects.values('teacher').annotate(vol=avg('volume'))#求平均值
    
    
    10 不返回queryset的api
    (1)獲取對象 get() #不存在或空會報錯,get_or_create(),first(),last(),latest(),earliest(),in_bulk()
        print(Course.objects.first())#第一條數據
        print(Course.objects.last())#最後一條數據
        print(Course.objects.earliest())#最近的一條數據
        print(Course.objects.latest())#最老的第一條數據
        print(Course.objects.in_bulk([1,2]))#根據主鍵的值批量返回對象
    (2)建立對象 create(),bulk_create(),update_or_create() 建立 ,批量建立,更新或建立
    (3)跟新對象,update.update_or_create() #更新,更新或建立
        Course.objects.filter(title='title').update(price=10)
    (4)刪除對象 delete() 使用filter過濾
        Course.objects.filter(title='title').delete()
    (5)其餘操做exists(),count,aggregate()#判斷是否存在,統計個數,聚合
        print(Course.objects.filter(title='title').exists())#查詢是否存在,存在返回True,不存在返回False
        print(Course.object.count())#返回記錄的個數
        print(Course.objects.aggregate(Max('price'),Min('price'),Avg('price'),Sum('price'))) #查詢數據庫表格裏面的價格的最大,最下,平均值
        
    11 自定義聚合查詢
    customer = Cou
    
    12 F對象和Q對象
    from django.db.models import Count,Avg,Min,MAx,Sum,F,Q
    Course.objects.update(price=F('price')-11)#將全部的價格在當前的基礎上-11
    Course.objects.filter(volume__lte=F('price')*10) #查詢數量小於價格十倍的數據
    print(Course.objects.filter(Q(title__icontains='python')&Q(volume__gte=5000)))#查詢名字包含python並且數量大於5000的對象
    print(Course.objects.filter(Q(title__icontains='go')|Q(volume__lte=1000))) #查詢標題包含go或者數量小於1000的對象
    結合AND,OR,NOT,|,~,&實現複雜的查詢
    
    
    

django的緩存

#在django的settings中,利用redis來作緩存
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        # "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "USER": 'redis',
            "PASSWORD": ":password",
            "SOCKET_CONNECT_TIMEOUT": 10,
            "CONNECTION_POOL_KWARGS": {
                "max_connections": 100,
            },
            # "SERIALIZER": "django_redis.serializers.json.JSONSerializer",
            "DECODE_RESPONSES": True,

        }
    }
}

#在視圖中
from django.core.cache import cache
#在接口中
key=''#一個標識,可根據前端傳過來的數據判斷
if cache.get(key):
    data=cache.get(key)
    return data
#在下面數據準備完成的時候
cache.set(key,data)#設置緩存
cache.expire(key,60*60)#緩存key和時間

linux相關操做

#查看firewalld狀態:systemctl status firewalld
#開啓防火牆:systemctl status firewalld
#關閉防火牆:systemctl stop firewalld

 django 取消自動重啓

python manage.py runserver --noreload 0.0.0.0:8003

 

QuerySet經常使用方法

使用 connection.queries 能夠查看sql語句
filter 將知足條件的結果返回,返回值爲QuerySet對象
exclude 將知足條件的結果過濾掉,返回值爲QuerySet對象
annotate 給QuerySet中的每個對象都添加一個查詢表達式,(Q,F,聚合函數)的字段
order_by 安裝某個字段進行排序,默認爲從小到大排序,若是想要重大到小能夠在字段前加「-」,須要注意order_by能夠傳遞多個參數,會按照前後級別進行排序,並且order_by還能夠用annotate新增的字段來排序,注意:order_by重複調用會只會保存最後一個。
values:提取須要哪些字段,默認會把所有都提取出來。返回的結果是QuerySet,可是其中包裹的不是模型,而是字典,若是想要提取關聯數據,那麼能夠經過F表達式來完成。values也可使用聚合函數
values_list 提取須要字段,返回QuerySet,其中包裹的元組,若是數據只有一條,則可使用flat=True進行扁平化處理,直接返回結果
all 方法:返回所有數據(返回包裹對象的QuerySet)
select_related : 能夠將關聯的對象一塊兒查詢出來,只能用於外鍵鏈接的形式(一對多或者一對一的形式)
prefetch_related : 使用的時候傳入反向引用的時候調用的名稱默認爲 filed_set,使用這個方式能夠用來查詢多對一或者多對多的方式,也能夠用來查詢一對一或者一對多的,可是不推薦。
defer : 過濾掉不須要的字段,返回值是一個包裹着模型的QuerySet
only : 提取某些字段,返回一個包裹模型的QuerySet
get : 直接返回對象,只能返回一條數據,若是返回數據超過一條就會報錯,若是沒有匹配到任何數據也會報錯。
create : 用於增長一條數據,而且將數據保存在數據庫中,至關於先建立數據,而後調用save方法
get_or_create : 若是給定的條件存在數據就查找返回,若是不存在就建立一個,而後在返回,返回結果是一個元組,元組中兩個內容,第一個是模型對象,第二個是bool值,若是沒有建立返回False,若是建立了返還True。
bulk_create :能夠一次性建立多條數據。
count :獲取知足條件的數據的個數
first,last 分別返回QuerySet中第一條和最後一條數據
exists : 判斷數據是否存在,存在返回True,不存在返回False
distinct : 去重,默認按照所有字段判斷。注意若是和order_by同時使用會失效
update :更新數據
delete : 刪除數據,須要注意:字段中on_delete的級聯刪除方式

 排序

product_list.sort(key=lambda x: x["goods_info"]['distance']) #按照距離排序

 

計算地球上兩個點之間的距離

 from geopy.distance import vincenty

                user_location = {'latitude': latitude, 'longitude': longitude}
                company_location = {'latitude': company_latitude, 'longitude': company_loginitude}

                dist = vincenty(
                    (user_location['latitude'], user_location['longitude']),
                    (company_location['latitude'], company_location['longitude'])
                ).km

 

           

配置雲服務器外部連接

開發好一個Django項目後,最終項目和數據庫都要遷移到服務器上,但服務器上新建的數據庫是沒有數據的,

此時咱們能夠在Navicat工具中將本地數據庫中的數據導入到服務器端的數據庫中,可是當團隊合做開發的時候,

若是每個人都各自使用一個數據庫,最終進行數據合併是不現實的,沒法實現數據統一。

採用搭在阿里雲上MySQL。這樣開發的時候避免倉庫中含有數據庫文件,數據不能統一。

採用一個遠端數據庫,能夠保證多人開發,共享一個數據庫,實現數據統一。

實現步驟:

xshell 鏈接雲主機:帳戶 用戶密碼
xshell下雲主機中安裝好mysql
設置mysql遠程數據庫帳戶 密碼
登陸數據庫服務器:
爲了能遠程登錄Mysql數據庫,須要打開訪問權限: 
進入Mysql後:
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> GRANT ALL PRIVILEGES ON *.* TO 用戶名@'%' IDENTIFIED BY '數據庫密碼' WITH GRANT OPTION;
Query OK, 0 rows affected (0.03 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges; 
Query OK, 0 rows affected (0.01 sec)
mysql> exit;
Bye
再重啓數據庫
service mysql restart
相關文章
相關標籤/搜索