python-day68--模型層基礎(model)


一、ORM : object relationship mapping   對象映射關系

映射關系:

     表名  <-------> 類名

       字段  <-------> 屬性

    表記錄 <------->類實例對象

二、創建表(建立模型)     必須是先創建表,再啟動項目

class Book(models.Model):
    nid = models.AutoField(primary_key = True )
     title = models.CharField( max_length = 32 )
     publishDate = models.DateField()
     price = models.DecimalField(max_digits = 5 ,decimal_places = 2 )
     keepNum = models.IntegerField()
 Book(nid=2,title='alex傳', publishDate ='2017-10-25',price='100.22',keepNum=2)    #實例化對象就是在Book表中添加 記錄

創建數據庫的兩條命令:

  python manage.py makemigrations     #app01(應用中的migrations文件夾中會生成一個文件)這是第一步:翻譯,把你寫的類中的信息進行調整,對應
    python manage.py migrate          #這是第二步 :是把sql語句執行,所有的表才會生成

注意1:.sqlite3 數據庫會自動創建數據庫,不需要提前創建,直接啟動項目就可以了

注意2:使用mysql數據庫時,在第一步創建庫的時候django會報錯,那是因為django默認按mysqldb執行,但是在python3版本中,沒有mysqldb,只有pymysql,故: 在應用(app01)下面的__init__.py中需配置一下:

import pymysql

pymysql.install_as_MySQLdb()

然后再執行創建數據庫的命令。

注意3:更換mysql數據庫時需要在settings中更改設置

 #把 sqlite3數據庫有關 信息 注釋掉
# DATABASES = {                   
#     'default': { 
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#     }
# }


DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.mysql',

        'NAME': 'blog',    #你的數據庫名稱

        'USER': 'root',   #你的數據庫用戶名

        'PASSWORD': '', #你的數據庫密碼

        'HOST': '', #你的數據庫主機,留空默認為localhost

        'PORT': '3306', #你的數據庫端口

    }

}

 補充:在settings文件中通過logging的設置可以查看翻譯成的sql語句

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

 

三、添加表記錄

1.普通字段:  推薦使用方式2

方式1  :類的實例化,需要save
publish_obj=Publish(name="人民出版社",city="北京",email="renMin@163.com")
publish_obj.save() # 將數據保存到數據庫

方式2    返回值publish_obj是添加的記錄對象  ,不需要save 
publish_obj=Publish.objects.create(name="人民出版社",city="北京",email="renMin@163.com")

 

四、修改表記錄

# 修改方式1:save(效率低)
        book_obj=models.Book.objects.filter(nid=id)[0]
        book_obj.title="金平"
        book_obj.save()
      #效率低是因為不管你是不是修改一個字段的值,django都會重新把所有的字段值賦值一遍。

# 修改方式2: 推薦使用
models.Book.objects.filter(nid=1).update(title='title',author='author',publishDate='pubDate',price='price')

 

五、刪除表記錄

models.Info.objects.filter(id=1).delete()
models.Info.objects.get(id=1).delete()

 

六、查詢表記錄

1.查詢相關API

<1> all():                 查詢所有結果
 
<2> filter(**kwargs):      它包含了與所給篩選條件相匹配的對象,可以多個條件,在括號內用逗號隔開
 
<3> get(**kwargs):         返回與所給篩選條件相匹配的對象,返回結果有且只有一個,
                           如果符合篩選條件的對象超過一個或者沒有都會拋出錯誤。
 
<5> exclude(**kwargs):     它包含了與所給篩選條件不匹配的對象
 
<4> values(*field):        返回一個ValueQuerySet——一個特殊的QuerySet,運行后得到的並不是一系列
                           model的實例化對象,而是一個可迭代的字典序列
 
<9> values_list(*field):   它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列
 
<6> order_by(*field):      對查詢結果排序
 
<7> reverse():             對查詢結果反向排序
 
<8> distinct():            從返回結果中剔除重復紀錄
 
<10> count():              返回數據庫中匹配查詢(QuerySet)的對象數量。
 
<11> first():              返回第一條記錄
 
<12> last():               返回最后一條記錄
 
<13> exists():             如果QuerySet包含數據,就返回True,否則返回False
    查詢方法API:


    1  all: models.表名.objects.all()
    
    book_all=models.Book.objects.all()  # 結果是querySet集合    [model對象,....]
    print(book_all) # <QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]>
    
    2 filter: models.表名.objects.filter() # 結果是querySet集合    [model對象,....]
    
    ret1=models.Book.objects.filter(author="yuan") # # <QuerySet [<Book: 追風箏的人>, <Book: asd>]>
    ret2=models.Book.objects.filter(nid=1) # <QuerySet [<Book: yuan>]>
    ret2=models.Book.objects.filter(author="yuan",price=123) # <QuerySet [<Book: yuan>]>
    print(ret2)
    
    3 get  models.表名.objects.get()   # model對象
    
    ret3=models.Book.objects.get(author="yuan")
    print(ret3.price)
    
    
    4 exclude : 排除條件
    ret4=models.Book.objects.exclude(author="yuan")
    print(ret4)
    
    5 values方法
    ret=models.Book.objects.filter(author="yuan").values("title","price")
    print(ret)# <QuerySet [{'title': '追風箏的人', 'price': Decimal('99.00')}, {'title': 'asd', 'price': Decimal('123.00')}]>
    
    6 values_list方法
    ret = models.Book.objects.filter(author="yuan").values_list("title", "price")
    print(ret) # <QuerySet [('追風箏的人', Decimal('99.00')), ('asd', Decimal('123.00'))]>
    
    7 distinct方法
    ret=models.Book.objects.filter(author="yuan").values("author").distinct()
    print(ret)
    
    8 count方法
    ret=models.Book.objects.filter(author="yuan").count()
    print(ret)
    
    9 first 方法
    ret = models.Book.objects.all().first()
    print(ret)
    
    10 exists方法
    if models.Book.objects.all().exists():
        print("exists")
    else:
        print("nothing")
API例子

注意:一定區分object與querySet的區別 !!!

2.雙下划線之單表查詢

models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 獲取id大於1 且 小於10的值
 
models.Tb1.objects.filter(id__in=[11, 22, 33])   # 獲取id等於11、22、33的數據
models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
 
models.Tb1.objects.filter(name__contains="ven")
models.Tb1.objects.filter(name__icontains="ven") # icontains大小寫不敏感
 
models.Tb1.objects.filter(id__range=[1, 2])      # 范圍bettwen and
 
ret=models.Book.objects.filter(price__gt=100)   #大於
ret=models.Book.objects.filter(price__gte=99) # 大於等於

    ret=models.Book.objects.filter(publishDate__year=2017,publishDate__month=10)    #2017年10月

ret=models.Book.objects.filter(author__startswith="")


startswith,istartswith, endswith, iendswith 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM