大家好,又見面了,我是你們的朋友全棧君。
打開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)
打開pycharm輸入
python manage.py shell
create方法也可以增加數據
也可以這樣改
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')
為了方便測試為goods表添加總數量跟庫存
為實體類添加字段
quantity = models.IntegerField(default=0, verbose_name="庫存")
totalCount = models.IntegerField(default=0, verbose_name="總數量")
生成遷移文件
python manage.py makemigrations
同步到數據庫中
python manage.py migrate
查詢總數量大於庫存的商品
使用aggregate()過濾器調用聚合函數。聚合函數包括:Avg平均,Count數量,Max最大,Min最小,Sum求和
例如:查詢所有商品的總數量
回顧一下表與表的關系,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
關聯查詢例子:
querySet是惰性操作,只有真正使用時候才會發送sql
例如:
goods = Goods.objects.all():不會發送sql(注意數據不一致,因為你寫這個sql的時候沒發出去,用的時候發出去,可能在這期間數據已經改變了)
print(goods)才會發送sql
可以通過print(goods.query)查看發出的sql語句 幫助調試
直接插入數據可能會沖突
Goods.objects.get_or_create(id=20,brand_id=1) 首先嘗試獲取,不存在就創建,可以防止重復
返回(object, True/False) true表示創建成功 false表示數據庫已經存在該數據
類似的還有update_or_create
方便查看 修改__str__方法為:
def __str__(self):
return '商品名字:%s,描述:%s' % (self.name,self.description)
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