zoukankan      html  css  js  c++  java
  • 五、django数据库操作

    PS:如果数据库坏了,或者更新不了表结构,就把数据库文件删除,migrations文件夹下面除init的文件删除,再makemigrations和migrate

    django自带的数据库是文件格式,工程目录下的db.sqlite3文件就是数据库文件,需要通过工具进行连接

    1、创建表

    创建一个表名为article的表

    class Article(models.Model):
        title = models.CharField(max_length=20,verbose_name='文章名称') #CharField是数据类型
        content = models.TextField(null=True,verbose_name='文章内容')
        # upload_to 指定上传到哪个目录下 ,null是否允许为空
        img = models.ImageField(upload_to='article_img',null=True,verbose_name='文章图片',default='article_img/1.jpg') #图片的处理
        is_delete = models.SmallIntegerField(default=1, verbose_name='是否被删除')
        #外键,models.DO_NOTHING主键如果被删了,什么都不做 ,db_constraint=False,并不是真实的外键,操作两张表互不影响
        nav = models.ForeignKey(Nav,verbose_name='导航id',on_delete=models.DO_NOTHING,db_constraint=False)
        create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)  # auto_now_add的意思,插入数据的时候,自动取当前时间
        update_time = models.DateTimeField(verbose_name='修改时间', auto_now=True)  # 修改数据的时候,时间会自动变
    
        # 把对象转换成数据
        def __str__(self):
            return self.title
    
        class Meta:
            verbose_name = '文章表' 
            verbose_name_plural = verbose_name
            db_table ='article' #表名,如果不写,django会自动生成以子目录加类名的表名,如user_article

     2、创建表结构,同步表

      1.创建表结构
        命令行,进入到项目目录
        执行命令:python manage.py makemigrations #创建表结构,产生迁移数据库的代码
        PS:如果改了表结构,一定要先执行这个命令,再同步到数据库里面
      2.创建同步表
        执行命令:python manage.py migrate #创建表,同步到数据库
        如果不指定主键,diango会自动给每个表加个id做为主键
        PS:所以,创建表、修改表,都需要使用这两个命令进行数据库结构的修改以及表的同步

    PS:在pycharm里面,tools里面有个run manger.py Task,进去之后直接用命令makemigrations、migrate就可以了

    3、数据库连接

    使用navicat的SQLite连接数据库,输入连接名,复制db.sqlite3的路径,连接数据库

    4、数据库字段说明

     字段选项说明

     5、QuerySet增删改查

     创建一个文件用于可以以python执行

      在子目录下创建一个文件model_test.py,或者文件名随便

      import django,os

      os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dj_test.settings')#设置django的配置文件

      django.setup()

      from user import models   #再引入创建表的文件

    这个文件就可以右键run执行了

    # #创建
    # obj = models.Article.objects.create(title='title_model',desc='desc1',content='content')
    # obj.title = 'new_title'
    # obj.save()
    #
    # obj2 = models.Article(title='title_model',desc='desc1',content='content')
    # obj2.save()
    #
    # #查询
    # models.Article.objects.get(id=1)#单个查询,条件只能是唯一的,否则会报错
    # models.Article.objects.filter(title='xiaohei',desc='desc1')#多条件查询,返回多条数据,写多个参数就是and
    # models.Article.objects.all().filter(title='xiaohei').values()#字典显示
    # models.Article.objects.all().count()#个数
    # models.Article.objects.raw('select * from user_article;') # 执行原生sql
    # models.Article.objects.filter(title__contains='模糊查询')
    # models.Article.objects.filter(title__endswith='开头')
    # models.Article.objects.filter(title__startswith='结尾')
    # models.Article.objects.filter(title__in=['title1','title2'])
    # models.Article.objects.filter(title__isnull=True)#为空
    # models.Article.objects.exclude(title__in=['title1','title2'])#排除
    # models.Article.objects.filter(read_count__gt=1)
    # models.Article.objects.filter(read_count__gte=1)
    # models.Article.objects.filter(read_count__lt=1)
    # models.Article.objects.filter(read_count__lte=1)
    # models.Article.objects.filter(read_count__range=(1,2,3))
    #
    #修改
    # art = models.Article.objects.get(pk=1)
    # art.title = 't1223'
    # art.save()
    #
    # models.Article.objects.filter(title__isnull=True).update(title='小黑') #批量修改
    # models.Article.objects.all().update(title='全部修改')
     
    #删除
    #models.Article.objects.get(pk=1).delete()
    #models.Article.objects.filter(title__isnull=True).delete()
    #models.Article.objects.all().delete()
     
     
    # #外键操作
    # obj = models.Article.objects.get(id=1)
    # obj.nav_id = 2 #获取外键信息
    # print(obj.nav.name) #获取外键信息
    # models.Article.objects.filter(nav__name='abc') #按照外键的字段筛选,外键名称__字段名
     
    #反向查询
    # art_obj = models.Article.objects.get(pk=1)
    # nav_obj = models.Nav.objects.get(pk=2)
    # print(nav_obj.article_set.filter())#外键反向查询
    # print(nav_obj.article_set.count())#外键反向查询
    # nav_obj.article_set.add(art_obj)#添加
    # nav_obj.article_set.remove(art_obj)#删除
    # nav_obj.article_set.clear()#清空
     
    #多对多
    # models.CaseSet.objects.create(name='主流程用例',desc='主流程')
    # models.CaseSet.objects.create(name='冒烟用例',desc='冒烟用例')
    #
    # models.Case.objects.create(title='登录')
    # models.Case.objects.create(title='注册')
    # models.Case.objects.create(title='订购')
    # models.Case.objects.create(title='支付')
    # models.Case.objects.create(title='充值')
    # models.Case.objects.create(title='发货')
     
    # c1 = models.Case.objects.get(pk=1)
    # c2 = models.Case.objects.get(pk=2)
    # c3 = models.Case.objects.get(pk=3)
    # s1 = models.CaseSet.objects.get(pk=1)
    # s2 = models.CaseSet.objects.get(pk=2)
     
    # s2.case_set.add(c2,c3)
    # s2.case_set.remove(c2,c3)
    # s2.case_set.clear()#清空
     
    # print(c2.case_set.all()) #查看用例在几个集合里面
    # print(s2.case_set.all()) #查看集合里面有多少用例
     
     
     
    #一对一
    #from hashlib import md5
    #models.Account.objects.create(account_id=md5('niuhanyang'.encode()).hexdigest())
    #models.Account.objects.create(account_id=md5('niuhanyang2'.encode()).hexdigest())
    #models.Account.objects.create(account_id=md5('niuhanyang3'.encode()).hexdigest())
     
    # models.User.objects.create(username='niuhanyang',password='123456',account_id='58e006ecfce801c5e98311c96d32510f')
    # u = models.User.objects.get(pk=1)
    # print(u.account_id)
    # print(u.account.money)
    #
    # acc = models.Account.objects.get(pk='58e006ecfce801c5e98311c96d32510f')
    # print(acc.user.username)
    # print(acc.user.password)

    表结构如下图:

    一对一,user表和account表

     nav表,外键,一对多

     case表和case_set表

  • 相关阅读:
    个人作业——软件评测
    软件工程第五次作业——结对编程的实现
    软件工程第三次作业
    软件工程第一次作业
    两个矩形面积交
    二维并查集
    Java 作业 1
    练习题
    线性表

  • 原文地址:https://www.cnblogs.com/yanyan-/p/11726063.html
Copyright © 2011-2022 走看看