zoukankan      html  css  js  c++  java
  • 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个查询结果的交集等等方法

     多表查询







  • 相关阅读:
    hibernate和mybatis区别
    Spring事务的传播行为和隔离级别
    数组拷贝
    spring mvc 一次请求 两次查询
    手游性能之渲染分析3
    Android pm 命令详解
    Android am命令使用
    Android dumpsys命令详细使用
    java处理高并发高负载类网站的优化方法
    关于ArrayList的5道面试题
  • 原文地址:https://www.cnblogs.com/mypath/p/14120727.html
Copyright © 2011-2022 走看看