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表