程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Django數據庫操作以及問題解決

編輯:Python
添加
# 表.objects.create
# 方法一
a = User.objects.create(userNum=123, name='ABB', age=18, sex='男')
# 方法二
d = dict(userNum=123, name='ABB', age=18, sex='男')
a = User.objects.create(**d)
#方法三
a = User(userNum=123, name='ABB', age=18, sex='男')
a.save()
參數解釋get_or_create只要有一個字段值與數據表中不相同(除主鍵),就會執行插入操作
如果完全相同則不進行插入操作,而是返回這行數據的數據對象update_or_create判斷當前數據在數據表中是否存在,若存在則進行更新,否則為新增表數據bulk_create對數據進行批量操作
v1 = User(userNum=123, name=‘ABB’, age=18, sex=‘男’)
v2 = User(userNum=124, name=‘ABC’, age=19, sex=‘女’)
info_list = [v1,v2]
User.objects.bulk_create(info_list)
刪除
# 表.objects.filter().delete()
# 方法一 刪除全部內容
User.objects.all().delete()
#方法二 刪除一條name為ABC的數據
User.objects.filter(name='ABC').delete()
#方法三 刪除多條數據
User.objects.filter(age=18).delete()

刪除過程中數據設有外鍵字段,就會同時刪除外鍵關聯的數據,刪除模式參考models.py中設置的PROTECT、SET_NULL等

修改
# 表.objects.filter().update()
# 方法一 修改name為ABC的性別為gay
User.objects.filter(name='ABC').update(sex='gay')
# 方法二
a = dict(age='1')
User.objects.filter(name='ABC').update(**a)
# 方法三 使用F方法實現自增/自減
from djanto.db.models import F
User.objects.filter(name='ABC').update(age=F('age')+1)
查詢
# select * from user 全表查詢
a = User.objects.all()
# 查第一條
a[0].name
# select * from user LIMIT3 查前3條
a = User.objects.all()[:3]
# filter 也可添加多個條件
User.objects.filter(name='ABC',age=18)
# SQL中or方法 select * from user where name='ABC' or age=18 ,需要引入 Q
from django.db.models import Q
User.objects.filter(Q(name='ABC') | Q(age=18))
# SQL中not方法 select * from user where not name='ABC' ,在Q前加~
User.objects.filter(~Q(name='ABC'))
# 統計數量
User.objects.filter(name='ABC').count()
# 去重 select DISTINCT name from user where name='ABC' ,distinct無需設置參數,去重方式根據values
a = User.objects.values('name').filter(name='ABC').distinct()
# 降序排序查詢,降序在order_by裡設置 '-'
User.objects.order_by('-age')
匹配符使用說明__exactfilter(name__exact=‘ABC’)完全等於__iexactfilter(name__iexact =‘ABC’)完全等於並忽略大小寫__containsfilter(name__contains =‘ABC’)模糊匹配,類似SQL中like %ABC%__icontainsfilter(name__icontains =‘ABC’)模糊匹配並忽略大小寫__gtfilter(name__gt =1)大於__gtefilter(name__gte =1)大於等於__ltfilter(name__lt=1)小於__ltefilter(name__lte=1)小於等於__isnullfilter(name__isnull=True/False)判斷是否為空
關聯表外鍵參數on_delete
(1)、on_delete = None:
刪除關聯表的數據時,當前表與關聯表的filed的行為。
(2)、on_delete = models.CASCADE:
表示級聯刪除,當關聯表(子表)中的數據刪除時,與其相對應的外鍵(父表)中的數據也刪除。
(3)、on_delete = models.DO_NOTHING:
你刪你的,父親(外鍵)不想管你
(4)、on_delete = models.PROTECT:
保護模式,如采用這個方法,在刪除關聯數據時會拋出ProtectError錯誤
(5)、on_delete = models.SET_DEFAULT:
設置默認值,刪除子表字段時,外鍵字段設置為默認值,所以定義外鍵的時候注意加上一個默認值。
(6)、on_delete = models.SET(值):
刪除關聯數據時,自定義一個值,該值只能是對應指定的實體
數據庫字段
  • 字符串

    password=models.CharField(verbose_name='密碼:',max_length=50)
    
  • 設置主鍵

    account=models.CharField(verbose_name='賬號:',max_length=50,primary_key=True,db_index=True)
    db_index:添加索引
    
  • 設置關聯外鍵

    account=models.ForeignKey(User_Account,on_delete = models.CASCADE)
    
  • 整型

    group_id=models.IntegerField(verbose_name='群聊編號')
    
  • 布爾類型

    models.BooleanField(verbose_name='是否可以增加文件',default=False)
    
  • 單選

    #sex choices 設置單選,元組前面的值為真是存儲值,後面的值為展示值sex=models.CharField(max_length=1,choices=[('男','男'),('女','女')])
    
  • 時間

    DateTimeField(DateField)x
    日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
    models.DateField(verbose_name='token更新時間',auto_now=True)
    日期格式 YYYY-MM-DD
    auto_now:每次修改都會自動更新
    auto_now_add:數據創建時值為添加時的時間,後續其他字段數據修改不會變
    TimeField(DateTimeCheckMixin, Field)
    時間格式 HH:MM[:ss[.uuuuuu]]
    
清空數據庫,重新建表
  • 想要刪除自己之前練習的數據庫模型

    Order.objects.all().values().delete()
    
  • 刪除文件

    • 刪除數據庫內所有的表
    • 刪除migrations文件夾中的所有 文件,除了__init__.py 文件
    • 運行
    python manage.py makemigrations
    python manage.py migrate
    
django 解決manage.py migrate無效的問題
  • 解決方案

    python manage.py dbshell 進到數據庫中,執行delete from django_migrations where app='your_appname';
    python manage.py makemigrations(若migrations文件未刪除,可不執行這一步)
    python manage.py migrate 好啦,大功告成
    
  • 原因

    造成多次應用migrations失敗的原因是,當前model是修改過的,原來的migrations已經被我刪除,但是,重新生成的migrations使用遞增整數記名,所以,在django_migrations表中0001,0002等前面幾個數字的文件都已被記錄,在Django看來,被記錄了就相當於已應用,所以,會出現剛開始的No migrations to apply.
    

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved