• Django框架的使用教程--mysql数据库[三]


    Django的数据库

    1.在Django_test下的view.py里面model定义模型

    from django.db import models
    
    
    # Create your models here.
    
    # 定义游戏模型类,继承models.Model
    class GameInfo(models.Model):
        gtitle = models.CharField(max_length=20, verbose_name='名称')
        game_date = models.DateField(verbose_name='游戏发布日期')
        # default可以设置默认值
        game_download = models.IntegerField(default=0, verbose_name='游戏下载量')
        gcommnet = models.IntegerField(default=0, verbose_name='游戏评论量')
        is_delete = models.BooleanField(default=False, verbose_name="逻辑删除")
    
        # 定义元数据
        class Meta:
            # db_tablespace  指定这个模型对应的数据表放在哪个数据空间
            # app_label     指定模型类的应用app
            db_table = 'game'  # 指名数据库类
            verbose_name = '游戏'  # 在admin站点显示的名称
            verbose_name_plural = verbose_name  # 显示复数名称
    
        def __str__(self):
            """定义数据对象的显示信息"""
            return self.gtitle
    
    
    # 定义游戏人物类
    # 定义英雄模型类HeroInfo
    class HeroInfo(models.Model):
        GENDER_CHOICES = (
            (0, 'male'),
            (1, 'female')
        )
        hname = models.CharField(max_length=20, verbose_name='名称')
        hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
        hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')
        # 关联数据表  外键
        hgame = models.ForeignKey(GameInfo, on_delete=models.CASCADE, verbose_name='游戏')  # 外键
        is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
    
        class Meta:
            db_table = 'game_heros'
            verbose_name = '英雄'
            verbose_name_plural = verbose_name
    
        def __str__(self):
            return self.hname

    2.生成迁移文件

    3.数据库迁移

    4.数据库插入数据(插入game表的数据)

    insert into game(gtitle,game_date, game_download,gcommnet,is_delete) values
    ('王者荣耀','2015-5-1',122,343,0),
    ('绝地求生','2016-7-24',363,403,0),
    ('天天酷跑','2005-12-24',20,80,0),
    ('时空猎人','1999-11-11',58,24,0);

    插入game_heros数据表的数据

    insert into game_heros(hname,hgender,hgame_id,hcomment,is_delete) values
    ('妲己',1,1,'魅惑',0),
    ('',0,1,'变身拿刀',0),
    ('诸葛亮',1,1,'远程导弹',0),
    ('黄总',1,1,'防御塔',0),
    ('吃鸡1号',0,1,'吃鸡1号技能',0),
    ('吃鸡2号',1,2,'吃鸡1号技能',0),
    ('吃鸡3号',1,2,'吃鸡1号技能',0),
    ('吃鸡4号',1,2,'吃鸡1号技能',0),
    ('吃鸡5号',0,2,'吃鸡5号技能',0),
    ('天天1号',1,3,'天天1号技能',0),
    ('天天2号',0,3,'天天2号技能',0),
    ('天天3号',1,3,'天天3号技能',0),
    ('天天4号',0,3,'天天4号技能',0),
    ('时空1号',1,4,'时空1号技能',0),
    ('时空2号',0,4,'时空2号技能',0),
    ('时空3号',0,4,'时空3号技能',0),
    ('时空4号',0,4,'时空4号技能',0);

     数据库的操作

    安装ipython

    pip install ipython

    进入命令脚本

    python manage.py shell

     数据库的增加

    create方法

    模型类.objects.create(数据表参数)

    save方法
    变量 = 模型类(参数)
    变量.save()


    数据库的查询

    查询多个值

    模型类.objects.all()

    查询单个值

    模型类.objects.get(id=2)

    查询结果的数量

    模型类.objects.count()

    过滤查询

    模型类.objects.filter(id__exact=1)

    模糊查询

    模型类.objects.filter(gtitle__contains='王')

    模型类.objects.filter(gtitle__endswith='耀')

    模型类.objects.filter(gtitle__startswith='天')

    空查询

    模型类.objects.filter(gtitle__isnull=False)

    范围查询

    模型类.objects.filter(id__in=[1,2])

    比较查询

    gt :大于

    gte: 大于等于

    lt :小与

    lte: 小与等于

    模型类.objects.filter(id__gt=3)  

     不等于

    模型类.objects.exclude(id=1)

    日期查询

    模型类.objects.filter(game_date__gt=date(1900,1,1))

    F对象(根据属性对比值)

    from django.db.models import F

    模型类.objects.filter(game_download__gte=F('gcomment'))

    Q对象

    与:

    模型类.objects.filter(game_download__gt=20,id__lt=3)

    或:

    模型类.object.filter(game_download__gt=20).filter(id_lt=3)

    用Q来表示&和|的连接:

    模型类.objects.filter(Q(game_download__gt=20) | Q(pk__lt=3))

    聚合函数

    Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和:

    from jango.db.models import Sum

    模型类.objects.aggregate(Sum(game_download))

    排序(默认升序,加-为降序)

    模型类.objects.all().order_by('game_download')

    模型类.objects.all().order_by('-bread')

    关联查询

    一对多:

    g = GameInfo.objects.get(id=1)

    g.heroinfo_set.all()

    多对一:

    h = HeroInfo.objects.get(id=1)

    h.hgame

    多对一:

    h = HeroInfo.objects.get(id=1)

    h.hgame_id

    关联过滤查询:

    模型类.objects.filter(heroinfo__hname='妲己')

    模型类.objects.filter(hgame__btitle='王者荣耀')

    数据库的修改

    save方法

    hero = HeroInfo.objects.get(hname='妲己')

    hero.hname = '王昭君'

    hero.save()

    update方法

    HeroInfo.objects.filter(hname='妲己').update(hname='王昭君')

    数据库的删除

    delete方法

    hero = HeroInfo.objects.get(id=3)

    hero.delete()

    模型类.objects.filter().delete()

    HeroInfo.objects.filter(id=4).delete()

    查询集的两大特性

    查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。

    1.惰性:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用

     2.缓存:使用同一个查询集,第一次使用时会发生数据库的查询,然后Django会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数。

    自定义管理器

    修改原始管理器的方法

    # 在django_test下的models.py文件中定义类
    
    class GameInfoManager(models.Manager):
        def all(self):
            return super().filter(is_delete=False)
    
    
    # 在模型类GameInfo中定义管理器
    class GameInfo(models.Model):
        games = GamesInfoManager()
    
    
    #使用方法
    GameInfo.games.all()

    在自定义的管理类可以自定义新的方法

     

    皮豆设计(logo设计神器):http://pidou.cn

  • 相关阅读:
    Gitlab 自动化部署 + 局域网访问 gitlab pages
    Gitlab 跨版本升级
    Gitlab 私有化管理 npm 包
    Postman-请求加密和设置 Cookie
    menuStrip鼠标滑过自动弹出
    JAVA实用案例之文件导入导出(POI方式)
    springboot npoi 合并单元格 之后设置单元格居中
    postman测试导出Excel接口
    Application.DoEvents()的作用
    设置WINFORM窗体及程序图标
  • 原文地址:https://www.cnblogs.com/gaidy/p/9248643.html
Copyright © 2020-2023  润新知