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个查询结果的交集等等方法
多表查询