django數據庫操作
model 層定義如下
from django.db import models
# Create your models here.
class Types(models.Model):
id = models.AutoField(primary_key=True)
firsts = models.CharField('一級類型',max_length=100)
seconds = models.CharField('二級類型',max_length=100)
def __str__(self):
return str(self.id)
class Meta:
verbose_name='商品類型'
verbose_name_plural = '商品類型'
class CommodityInfos(models.Model):
id = models.AutoField(primary_key = True)
name = models.CharField('商品名稱',max_length=100)
sezes = models.CharField('商品規格',max_length=100)
types = models.CharField('商品類型',max_length=100)
price = models.FloatField('商品價格')
discount = models.FloatField('折后價格')
stock = models.IntegerField('存貨數量')
sold = models.IntegerField('已售數量')
likes = models.IntegerField('收藏數量')
created = models.DateField('上架日期',auto_now_add=True)
img = models.FileField('商品主圖',upload_to=r'imgs')
details = models.FileField('商品介紹',upload_to=r'details')
def __str__(self):
return str(self.id)
class Meta:
verbose_name ='商品信息'
verbose_name_plural='商品信息'
1 打開django的shell模式
python manage.py shell
添加操作
方法一
t = Types()
t.firsts = '女裝'
t.second = '男裝'
t.save()
方法二
#創建
t= Types.object.create(firsts='兒童用品',seconds='嬰兒車')
#獲取新增的數據id
t.id
方法三
t = Type(firsts='兒童用品',seconds='嬰兒車')
t.save()
查詢數據,沒有就添加一條
d = dict(firsts = '兒童教育',seconds = '童話書籍')
t = Type.object.get_or_create(**d)
print(t)
結果為
(<Types: 6>, True)
說名新加了一條數據
再次運行出現
(<Types: 6>, False)
說明該數據已經存在了。
可以使用t[0].id獲取對應的id值
如果數據存在就修改,如果數據不存在就添加,注意如果有多條數據符合條件將報錯
d = dict(firsts = '兒童教育',seconds = '童話書籍')
t = Types.object.update_or_create(**d,defaults={'firsts':'兒童教育'})
批量添加操作
注意d1 d2的寫法,是傳參數的類
d1 = Types(firsts = '兒童教育',seconds = '童話書籍')
d2 = Types(firsts = '兒童影視',seconds = '童話動畫')
obj_list = [d1,d2]
t = Types.object.bulk_create(obj_list)
數據更新操作
方法一
t = Type.objects.get(id=1)
t.firsts='兒童用品'
t.save()
方法二
t = Types.objects.filter(id=1).update(seconds='男裝')
修改id為1的數據,使他的seconds字段變為男裝
也可以寫成
d = dict(seconds='男裝')
t = Types.objects.filter(id=1).update(**d)
如果不加入filter作為限制項,則修改針對所有數據
from django.db.models import F
將某數據在原基礎上加10
這里需要使用F
from django.db.models import *
t= Types.objects.filter(id=1)
t.update(id=F('id')+10)
這里是讓id為1的數據的d加10
刪除數據
方法一
刪除全部數據
Types.objects.all().delete()
刪除一條數據
Types.objects.get(id=1).delete()
刪除多條數據
Type.objects.filter(firsts='兒童用品').delete()
如果刪除的數據有其他表關聯,則根據建表時外鍵字段的on_delete的不同有不同的表現
比如on_delete = models.CASCADE則刪除了一條信息,與之關聯的信息會被直接刪除
PROTECT模式 刪除有關聯的數據直接提示數據刪除失敗
SET_NULL模式 將關聯被刪除數據的數據外鍵設為null,建表時必須允許外鍵為null才可以否則爆炸
SET_DEFAULT模式 將被刪除的外鍵字段改為設置好的默認值
SET模式 將關聯數據被刪除的數據的外鍵關聯到其他的數據
DO_NOTHING模式 不做任何處理,刪除結果由數據庫的刪除看模式決定
添加2張表,model如下
from django.db import models
# Create your models here.
class PersonInfo(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20)
age = models.IntegerField()
hireDate = models.DateField()
def __str__(self):
return self.name
class Meta:
verbose_name = '人員信息'
class Vocation(models.Model):
id = models.AutoField(primary_key=True)
job = models.CharField(max_length=20)
title = models.CharField(max_length=20)
payment = models.IntegerField(null=True,blank=True)
name = models.ForeignKey(PersonInfo,on_delete=models.CASCADE,related_name='ps')
def __str__(self):
return str(self.id)
class Meta:
verbose_name='職業信息'
查詢操作
from index.models import *
查詢表中所有數據:
v = Vocation.objects.all()
查看第一條信息的職業
print(v[0].job)
查詢前三條數據
v = Vocation.objects.all()[:3]
查詢單個字段 數據以元組加列表的形式返回
v = Vocation.object.values('job')
數據以字典的形式返回
v = Vocation.objects.values()
使用get方法查詢
t = Vocation.objects.get(id=1)
print(t.job)
使用filter也可以按照條件查詢,但是是查詢多條的
v = Vocation.objects.filter(id=3)
print(v[0].job)
filter多條件 查詢
v = Vocations.objects.filter(id=3,title='前臺文員')
這里是根據多個條件查詢內容
也可以根據字典定義
d = dict(id=1,title='前臺文員')
v = Vocation.objects.filter(**d)
但是這里有問題,這里的條件是等于,如果想搞個大于或者大于等于則需要使用一些特定的寫法
__exact 精確等于 like ‘aaa’
__iexact 精確等于 忽略大小寫 ilike ‘aaa’
__contains 包含 like ‘%aaa%’
__icontains 包含 忽略大小寫 ilike ‘%aaa%’,但是對于sqlite來說,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一個list范圍內
__startswith 以…開頭
__istartswith 以…開頭 忽略大小寫
__endswith 以…結尾
__iendswith 以…結尾,忽略大小寫
__range 在…范圍內
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
__isnull=True 與 __exact=None的區別
舉個例子:
v = Vocation.objects.filter(id__gt=2, title='前臺文員')
查詢的是id大于2且title等于前臺文員
這里還得注意一下,等于可以用=,不等不能用!=,如果要表示不等使用~表示,后面會介紹
如果想查詢或這種關系的條件可以使用Q,不過Q需要引用
from django.db.model import Q
v = Vocation.objects.filter(Q(id=1)|Q(job='網頁設計'))
sql中的不等于查詢條件的寫法
v = Vocation.objects.filter(~Q(job='網站設計'))
另一種寫法:
v = Vocation.objects.exclude(job='前臺設計')
統計一共多少條數據
v = Vocation.objects.count()
根據id倒序排序同時根據job排序
v = Vocation.objects.order_by('-id','job')
對某一個字段進行去重操作,下面這個還加個條件
v = Vocation.objects.values('job').filter(job='網站設計').distinct()
聚合查詢,實現對數據值求和求平均值
·主要使用annotate和aggregate,其他的還有求2個查詢結果的交集等等方法
多表查詢

浙公網安備 33010602011771號