一、ORM : object relationship mapping 对象映射关系
映射关系:
表名 <-------> 类名
字段 <-------> 属性
表记录 <------->类实例对象
二、创建表(建立模型) 必须是先创建表,再启动项目
class Book(models.Model):
nid = models.AutoField(primary_key=True)
title = models.CharField( max_length=32)
publishDate=models.DateField()
price=models.DecimalField(max_digits=5,decimal_places=2)
keepNum=models.IntegerField()
Book(nid=2,title=\'alex传\',
publishDate=\'2017-10-25\',price=\'100.22\',keepNum=2) #实例化对象就是在Book表中添加 记录创建数据库的两条命令:
python manage.py makemigrations #app01(应用中的migrations文件夹中会生成一个文件)这是第一步:翻译,把你写的类中的信息进行调整,对应
python manage.py migrate #这是第二步 :是把sql语句执行,所有的表才会生成
注意1:.sqlite3 数据库会自动创建数据库,不需要提前创建,直接启动项目就可以了
注意2:使用mysql数据库时,在第一步创建库的时候django会报错,那是因为django默认按mysqldb执行,但是在python3版本中,没有mysqldb,只有pymysql,故: 在应用(app01)下面的__init__.py中需配置一下:
import pymysql pymysql.install_as_MySQLdb()
然后再执行创建数据库的命令。
注意3:更换mysql数据库时需要在settings中更改设置
#把 sqlite3数据库有关 信息 注释掉 # DATABASES = { # \'default\': { # \'ENGINE\': \'django.db.backends.sqlite3\', # \'NAME\': os.path.join(BASE_DIR, \'db.sqlite3\'), # } # } DATABASES = { \'default\': { \'ENGINE\': \'django.db.backends.mysql\', \'NAME\': \'blog\', #你的数据库名称 \'USER\': \'root\', #你的数据库用户名 \'PASSWORD\': \'\', #你的数据库密码 \'HOST\': \'\', #你的数据库主机,留空默认为localhost \'PORT\': \'3306\', #你的数据库端口 } }
补充:在settings文件中通过logging的设置可以查看翻译成的sql语句
LOGGING = { \'version\': 1, \'disable_existing_loggers\': False, \'handlers\': { \'console\': { \'level\': \'DEBUG\', \'class\': \'logging.StreamHandler\', }, }, \'loggers\': { \'django.db.backends\': { \'handlers\': [\'console\'], \'propagate\': True, \'level\': \'DEBUG\', }, } }
三、添加表记录
1.普通字段: 推荐使用方式2
方式1 :类的实例化,需要save publish_obj=Publish(name="人民出版社",city="北京",email="renMin@163.com") publish_obj.save() # 将数据保存到数据库 方式2 返回值publish_obj是添加的记录对象 ,不需要save publish_obj=Publish.objects.create(name="人民出版社",city="北京",email="renMin@163.com")
四、修改表记录
# 修改方式1:save(效率低) book_obj=models.Book.objects.filter(nid=id)[0] book_obj.title="金平" book_obj.save() #效率低是因为不管你是不是修改一个字段的值,django都会重新把所有的字段值赋值一遍。
# 修改方式2: 推荐使用
models.Book.objects.filter(nid=1).update(title=\'title\',author=\'author\',publishDate=\'pubDate\',price=\'price\')
五、删除表记录
models.Info.objects.filter(id=1).delete()
models.Info.objects.get(id=1).delete()
六、查询表记录
1.查询相关API
<1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象,可以多个条件,在括号内用逗号隔开 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个, 如果符合筛选条件的对象超过一个或者没有都会抛出错误。 <5> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <4> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列 <9> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 <6> order_by(*field): 对查询结果排序 <7> reverse(): 对查询结果反向排序 <8> distinct(): 从返回结果中剔除重复纪录 <10> count(): 返回数据库中匹配查询(QuerySet)的对象数量。 <11> first(): 返回第一条记录 <12> last(): 返回最后一条记录 <13> exists(): 如果QuerySet包含数据,就返回True,否则返回False
查询方法API: 1 all: models.表名.objects.all() book_all=models.Book.objects.all() # 结果是querySet集合 [model对象,....] print(book_all) # <QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]> 2 filter: models.表名.objects.filter() # 结果是querySet集合 [model对象,....] ret1=models.Book.objects.filter(author="yuan") # # <QuerySet [<Book: 追风筝的人>, <Book: asd>]> ret2=models.Book.objects.filter(nid=1) # <QuerySet [<Book: yuan>]> ret2=models.Book.objects.filter(author="yuan",price=123) # <QuerySet [<Book: yuan>]> print(ret2) 3 get models.表名.objects.get() # model对象 ret3=models.Book.objects.get(author="yuan") print(ret3.price) 4 exclude : 排除条件 ret4=models.Book.objects.exclude(author="yuan") print(ret4) 5 values方法 ret=models.Book.objects.filter(author="yuan").values("title","price") print(ret)# <QuerySet [{\'title\': \'追风筝的人\', \'price\': Decimal(\'99.00\')}, {\'title\': \'asd\', \'price\': Decimal(\'123.00\')}]> 6 values_list方法 ret = models.Book.objects.filter(author="yuan").values_list("title", "price") print(ret) # <QuerySet [(\'追风筝的人\', Decimal(\'99.00\')), (\'asd\', Decimal(\'123.00\'))]> 7 distinct方法 ret=models.Book.objects.filter(author="yuan").values("author").distinct() print(ret) 8 count方法 ret=models.Book.objects.filter(author="yuan").count() print(ret) 9 first 方法 ret = models.Book.objects.all().first() print(ret) 10 exists方法 if models.Book.objects.all().exists(): print("exists") else: print("nothing")
注意:一定区分object与querySet的区别 !!!
2.双下划线之单表查询
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据 models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in models.Tb1.objects.filter(name__contains="ven") models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感 models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and ret=models.Book.objects.filter(price__gt=100) #大于 ret=models.Book.objects.filter(price__gte=99) # 大于等于 ret=models.Book.objects.filter(publishDate__year=2017,publishDate__month=10) #2017年10月 ret=models.Book.objects.filter(author__startswith="张") startswith,istartswith, endswith, iendswith