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

django models.py(python和django)

編輯:Python

大家好,又見面了,我是你們的朋友全棧君。

文章目錄
  • 1.創建模型類
  • 2.shell工具增刪改查
    • 2.1增
    • 2.2修改
    • 2.3刪除
    • 2.4查詢
    • 2.5比較屬性
    • 2.6sql中的and、or
    • 2.7mysql的聚合函數
    • 2.8mysql中的排序
    • 2.9關聯查詢
  • 3.其它操作
    • 3.1querySet惰性與查看sql
    • 3.2get_or_create
    • 3.3切片操作
    • 3.4querySet迭代判斷
    • 3.5querySet去重distinct
    • 3.6查詢某些字段values_list/values
    • 3.7排除不需要的字段,減少mysqlO
    • 3.8選擇需要的字段only
    • 3.9n+1問題

1.創建模型類

打開pay應用的models.py創建模型類

from datetime import datetime
from django.db import models
# Create your models here.
# 創建品牌的模型類
class Brand(models.Model):
# 創建字段,字段類型...
name = models.CharField(max_length=20, verbose_name='名稱')
add_time = models.DateTimeField(default=datetime.now, verbose_name="添加時間")
is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除')
class Meta:
db_table = 'brand' # 指明數據庫表名
verbose_name = '分類' # 在admin站點中顯示的名稱
def __str__(self): # self代表當前對象 相當於java的this
"""定義每個數據對象的顯示信息,相當於java的toString方法"""
return self.name
# 創建商品的模型類
class Goods(models.Model):
GENDER_CHOICES = ( # 數據庫存儲為0跟1 待會查詢出來的時候,對象就會替換為後面的value
(0, '上架'),
(1, '下架')
)
name = models.CharField(max_length=20, verbose_name='名稱')
status = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='狀態')
description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
brand = models.ForeignKey(Brand, on_delete=models.CASCADE, verbose_name='品牌') # 外鍵
is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除')
class Meta:
db_table = 'goods'
verbose_name = '商品信息'
def __str__(self):
return self.name

修改站點admin.py

from django.contrib import admin
from .models import Goods, Brand
# Register your models here.
admin.site.register(Brand)
admin.site.register(Goods)

1) 數據庫表名

模型類如果未指明表名,Django默認以小寫app應用名_小寫模型類名為數據庫表名。

可通過db_table指明數據庫表名。

2) 關於主鍵

django會為表創建自動增長的主鍵列,每個模型只能有一個主鍵列,如果使用選項設置某屬性為主鍵列後django不會再創建自動增長的主鍵列。

默認創建的主鍵列屬性為id,可以使用pk代替,pk全拼為primary key。

生成遷移文件
python manage.py makemigrations
同步到數據庫中
python manage.py migrate

創建測試數據:

INSERT INTO brand(NAME,add_time,is_delete) VALUES('手機',NOW(),0)
,('電腦',NOW(),0),('衣服',NOW(),0),('鞋子',NOW(),0),('生活用品',NOW(),0)
INSERT INTO goods(NAME,STATUS,description,is_delete,brand_id)
VALUES('華為',0,'華為手機就是牛',0,1),('小米',0,'小米手機天下第一',0,1)
,('聯想',0,'聯想',0,1),('七匹狼',0,'七匹狼',0,1),('鬼冢',0,'aaaa',0,1)
,('拖把',0,'aaaa',0,1)

2.shell工具增刪改查

打開pycharm輸入

python manage.py shell 

2.1增

create方法也可以增加數據

2.2修改

也可以這樣改

2.3刪除

2.4查詢

get查詢單一結果,如果不存在會拋出模型類.DoesNotExist異常。

all查詢多個結果。

count統計個數。

mysql的where功能

filter過濾出多個結果
exclude排除掉符合條件剩下的結果
get過濾單一結果

例如:查詢編號為1的品牌

Brand.objects.filter(id__exact=1) (exact表示相等的意思,兩個下劃線__)
可簡寫為:
Brand.objects.filter(id=1)
查詢id不為2的記錄
Brand.objects.exclude(id=2)

mysql中like的功能:

contains:是否包含。 如果要包含%無需轉義,直接寫即可。

例如:

查詢品牌名字中包含'電'的記錄
Brand.objects.filter(name__contains='電')
查詢品牌名字中以'電'開頭的
Brand.objects.filter(name__startwith='電')
查詢品牌名字中以'腦'結尾的
Brand.objects.filter(name__endwith='電')
不區分大小寫就在前面+i icontains istartwith iendwith iexact等

mysql中null的功能

查詢品牌名字為null的記錄
Brand.objects.filter(name__isnull=True) 不為null就是等於false

mysql中in的功能

查詢品牌id為2 4 的
Brand.objects.filter(id__in=[2,4])

mysql中比較查詢

gt大於 (greater then)
gte大於等於 (greater then equal)
lt小於 (less then)
lte小於等於 (less then equal)
例如:
查詢品牌id大於2的記錄
Brand.objects.filter(id__gt=2)

mysql的日期查詢

year、month、day、week_day、hour、minute、second:對日期時間類型的屬性進行運算。
例如:查詢2021年添加的品牌
Brand.objects.filter(add_time__year='2021')
查詢2021年10月1日後添加的品牌
Brand.objects.filter(add_time__gt='2021-10-01')

2.5比較屬性

為了方便測試為goods表添加總數量跟庫存

為實體類添加字段
quantity = models.IntegerField(default=0, verbose_name="庫存")
totalCount = models.IntegerField(default=0, verbose_name="總數量")
生成遷移文件
python manage.py makemigrations
同步到數據庫中
python manage.py migrate

查詢總數量大於庫存的商品

2.6sql中的and、or

2.7mysql的聚合函數

使用aggregate()過濾器調用聚合函數。聚合函數包括:Avg平均,Count數量,Max最大,Min最小,Sum求和

例如:查詢所有商品的總數量

2.8mysql中的排序

2.9關聯查詢

回顧一下表與表的關系,goods表有外鍵 brand關聯品牌表

from datetime import datetime
from django.db import models
# Create your models here.
# 創建品牌的模型類
class Brand(models.Model):
# 創建字段,字段類型...
name = models.CharField(max_length=20, verbose_name='名稱')
add_time = models.DateTimeField(default=datetime.now, verbose_name="添加時間")
is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除')
class Meta:
db_table = 'brand' # 指明數據庫表名
verbose_name = '分類' # 在admin站點中顯示的名稱
def __str__(self): # self代表當前對象 相當於java的this
"""定義每個數據對象的顯示信息,相當於java的toString方法"""
return self.name
# 創建商品的模型類
class Goods(models.Model):
GENDER_CHOICES = ( # 數據庫存儲為0跟1 待會查詢出來的時候,對象就會替換為後面的value
(0, '上架'),
(1, '下架')
)
name = models.CharField(max_length=20, verbose_name='名稱')
status = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='狀態')
description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
brand = models.ForeignKey(Brand, on_delete=models.CASCADE, verbose_name='品牌') # 外鍵
is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除')
quantity = models.IntegerField(default=0, verbose_name="庫存")
totalCount = models.IntegerField(default=0, verbose_name="總數量")
class Meta:
db_table = 'goods'
verbose_name = '商品信息'
def __str__(self):
return self.name

關聯查詢例子:

3.其它操作

3.1querySet惰性與查看sql

querySet是惰性操作,只有真正使用時候才會發送sql
例如:
goods = Goods.objects.all():不會發送sql(注意數據不一致,因為你寫這個sql的時候沒發出去,用的時候發出去,可能在這期間數據已經改變了)
print(goods)才會發送sql
可以通過print(goods.query)查看發出的sql語句 幫助調試

3.2get_or_create

直接插入數據可能會沖突
Goods.objects.get_or_create(id=20,brand_id=1) 首先嘗試獲取,不存在就創建,可以防止重復
返回(object, True/False) true表示創建成功 false表示數據庫已經存在該數據
類似的還有update_or_create

3.3切片操作

3.4querySet迭代判斷

3.5querySet去重distinct

3.6查詢某些字段values_list/values

方便查看 修改__str__方法為:
def __str__(self):
return '商品名字:%s,描述:%s' % (self.name,self.description)

3.7排除不需要的字段,減少mysqlO

3.8選擇需要的字段only

3.9n+1問題

select_related:實用一對一,多對一關系

直接join sql比較簡單請自己看

prefetch_related:適用於多對多,一對多情況

是在第一次使用的時候發送

select * from goods where brand_id in(1,2,3,4,5)

因為多對多(比如A表5條對B表5條,join中間表就會是5*5),中間表就會冗余A表每條記錄4次 ,而用in的話只需要查B表字段 A表就不會冗余 減少中間表的大小,節約內存

發布者:全棧程序員棧長,轉載請注明出處:https://javaforall.cn/129300.html原文鏈接:https://javaforall.cn


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