【原】Django数据Model层总结
vlaues - 单条记录 - <class 'dict'> 多条记录 - <class 'django.db.models.query.QuerySet'> vlaues_list - 单条记录 - <class 'tuple'> 多条记录 - <class 'django.db.models.query.QuerySet'>
Django的抽象模型Models可以直接对数据库进行增删改查,不需要你自己写SQL语言来进行相关数据库操作。今天我们就以博客blog为例,看下Django是如何对数据库进行增删改查的。
我们将会用到如下这个简单的Article模型:
from django.db import models class Article(models.Model): title = models.CharField('标题', max_length=200, unique=True) body = models.TextField('正文') def __str__(self): return self.title
1.增
增即创建新的对象或添加新的条目。如果我们要给数据库添加一篇新的文章,Django提供了2种常见操作方式。
方法一,传统save方法。
obj = Article(title="My first article", body="My first article body") obj.save()
注意: 该方法如果不选择save(), 创建的对象将不会保存到数据库中去。正因为如此,Django还提供了更便捷的create方法。
方法二,便捷的create方法。
Article.objects.create(title="My first article", body="My first article body")
注意: 对Django自带auth模块中的User模型操作,比如创建新的用户时,请用create_user方法。该方法会将密码自动加Hash存储到数据库中。
from django.contrib.auth.models import User user = User.objects.create_user(username='john', email='john@gmail.com', password='somepwd')
2.删
删即删除一个已有对象或从表中删除一个已有条目。Django也允许同时删除多个对象或条目。
案例一,删除所有文章 (请慎用!!)
Article.objects.all().delete()
案例二,删除标题里含有python的所有文章(不区分大小写)
Article.objects.filter(title__icontains="python").delete()
3.改
改既可以用save方法,也可以用update方法。其区别在于save方法不仅可以更新数据中现有对象数据,还可以创建新的对象。而update方法只能用于更新已有对象数据。一般来说,如果要同时更新多个对象数据,用update方法更合适。
案例一,利用save方法更新某一文章标题
article = Article.objects.get(id=1) article.title = "New article title" article.save()
案例二,利用update方法更新某一文章标题
article = Article.objects.get(id=1).update(title='new title')
案例三,利用update方法更新多篇文章标题
article = Article.objects.filter(title__icontains='python').update(title='Django')
4.查
Django对于数据库的查询主要是get和filter等方法。我们来看几个案例。
案例一,查询所有数据
Article.objects.all()
Article.objects.all().values()
# 只获取title列表-字典形式
Article.objects.all().values('title')
# 只获取title列表- 元组形式,只有value,没有key
Article.objects.all().values_list('title')
注意:使用values和values_list可以减少数据库查询工作量。如果只需要在模板中使用某些字段,而不是全部字段,建议使用values和values_list。
案例二,查询某一条数据
Article.objects.get(id=1)
案例三,模糊查询返回数据集, 并去重
Article.objects.filter(title__icontains='python').distinct()