五、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表

原文地址:https://www.cnblogs.com/yanyan-/p/11726063.html