Django---ORM总结
来源:互联网 发布:安祖赛弗的数据1 编辑:程序博客网 时间:2024/05/21 19:47
model(数据库操作)
1 django默认支持sqlite,mysql, oracle,postgresql数据库。
** <1> sqlite** django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 , 引擎名称:django.db.backends.sqlite3 <2> mysql 引擎名称:django.db.backends.mysql
2 mysql驱动程序
- MySQLdb(mysql python)
- mysqlclient
- MySQL
- PyMySQL(纯python的mysql驱动程序)
3 在django的项目中会默认使用sqlite数据库,在settings里有如下设置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }}DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'books', #你的数据库名称 'USER': 'root', #你的数据库用户名 'PASSWORD': '', #你的数据库密码 'HOST': '', #你的数据库主机,留空默认为localhost 'PORT': '3306', #你的数据库端口 }
orm(对象关系映射)
orm 就是说 python中的模型(类) 映射 到原生的sql语句
.query 方法查询orm对应的sql语句
print(models.Purte.objects.filter(book__title__startswith='d').values('name').query)
单表
增
save方法
#save方式添加user_message = UserInfo() user_message.username = 'lisi' user_message.age=18 user_message.user_type=1 user_message.save()
create方法
#字典方式添加dic = {'username':'mosson','age':18,'user_type_id':1}models.UserInfo.objects.create(**dic)#先获取组的对象usertype = models.UserType.objects.fiter(id=2)#添加的时候直接添加对象就可以models.UserInfo.objects.create(username='seven',age=18,user_type=usertype)#写成一行也行models.UserInfo.objects.create(username='lile',age=18,user_type=models.UserType.objects.filter(id=1))
删
models.UserInfo.object.filter(id=1).delete()
改
update
models.UserInfo.objects.filter(id__gt=0).update(username='admin')
save
user = models.UserInfo.objects.get(id=2) user.username='root3' user.save() user = models.UserInfo.objects.filter(id=1)[0] user.username='root2' user.save()
注意
update 是QuerySet对象的方法
查
models.UserInfo.objects.all() #返回一个QuerySet集合对象models.UserInfo.objects.filter()#返回一个QuerySet集合对象models.UserInfo.objects.get()#返回一个行对象user = models.UserInfo.objects.filter(id=1).values('username') #等同于‘select username form UserInfo’返回<QuerySet [{'user': 'admin'}]>user = models.UserInfo.objects.all().order_by('id')#根据id排序models.UserInfo.objects.all().order_by('-id')#根据id逆向排序user = models.UserInfo.objects.values('username').distinct()# 去重
一对一(oneToOne)
就是在一对多的基础上 将多的那一个设置唯一:author=True
一对多(Foreignkey)
Object Relational Mapping(关系对象映射)
class UserType(models.Model): caption = models.CharField(max_length=32)class UserInfo(models.Model): username = models.CharField(max_length=32) age = models.IntegerField() user_type = models.Foreignkey('UserType')#外键
正向查找:ForeignKey在UserInfo表中,如果从UserInfo表开始想其他表查询,这个就是正向查找,反之就是反向查找
增
create
#方式一models.UserInfo.objects.create(username='lisi',age=18,user_type_id=1)#方式二models.UserInfo.objects.create(username='lisi',age=18,user_type=obj)
多对多(ManyToMany)
系统生产成第三张表
class Book(models.Model): title = models.CharField(max_length=64) price = models.IntegerField() color = models.CharField(max_length=64) page_nub = models.IntegerField() author = models.ManyToManyField('Author') def __str__(self): return self.titleclass Author(models.Model): name = models.CharField(max_length=64) def __str__(self): return self.name
绑定add
正向查找
author1 = models.Author.objects.get(id=1) author2 = models.Author.objects.get(id=2) books = models.Book.objects.get(id=1) books.author.add(author1,author2)
反向查找
author = models.Author.objects.get(id=1)books = models.Book.objects.get(id__gt=1)author.book_set。add(*books)
移除remove
author1 = models.Author.objects.get(id=1) author2 = models.Author.objects.get(id=2) books = models.Book.objects.get(id=1) books.author.remove(author1,author2)
自定义第三张表
class Book(models.Model): title = models.CharField(max_length=64) price = models.IntegerField() color = models.CharField(max_length=64) page_nub = models.IntegerField() # author = models.ManyToManyField('Author') def __str__(self): return self.titleclass Author(models.Model): name = models.CharField(max_length=64) def __str__(self): return self.nameclass Boot2Author(models.Model): book = models.ForeignKey(to='Book') author = models.ForeignKey(to='Author') class Meta: unique_together=['book','author']
增
author1 = models.Author.objects.get(id=1) books = models.Book.objects.get(id=1) models.Boot2Author.objects.create(book=books,author=author1)
删——级联删除
models.Book.objects.filter(id=1).delete()这时Book表中id等于1的行被删掉并且,Book2Author表中含有Book_id = 1的行也会被删掉
了不起的双下划线
单表查询
id__gt 大于1models.Book.objects.filter(id__gt=1):id__lt 小于3models.Book.objects.filter(id__lt=3):id__in id在[1,2,3]中的行查询到 在某个范围models.Book.objects.filter(id__in=[1,2,3]):__contatins 包含某些字段models.Book.objects.filter(title__contains='c'):__icontatins 不区分大小写models.Book.objects.filter(title__icontains='c'):__startswith 以什么开头models.Book.objects.filter(title__startswith='d')
关联查询
models.Purte.objects.filter(book__title__startswith='d').values('name')自定义表的多对多关联查询models.Author.objects.filter(id__gt=1).values('boot2author__book__title')
聚合查询和分组查询
aggregate(*args,**kwagrs)
通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中每一个参数都指定一个包含在字典中返回值。即在查询集合上生成聚合
from django.db.models import Avg,Min,Sum,Maxa = models.Book.objects.all().aggregate(Avg('price')) #求平均值print(a)b = models.Book.objects.all().aggregate(Min('price')) #求最小值print(b)c = models.Book.objects.all().aggregate(Sum('price')) #求和print(c)d = models.Book.objects.all().aggregate(Max('price')) #求最大值print(d)
annotate
可以通过计算查询结果中的每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合
a = models.Book.objects.values('puter__name').annotate(Sum('price'))#根据puter表中的name字段分组 并计算price的和print(a)
F查询和Q查询
F查询
from django.db.models import F#将Book表中的price列的值加 10models.Book.objects.all().update(price=F("price")+10)
Q查询
#在Book表中查询id=2 或 title='C'的数据models.Book.objects.filter(Q(id=2) | Q(title='C'))#在Book表中查询id大于2 并且 color='as'的数据models.Book.objects.filter(Q(id__gt=2)&(Q(color='as')))#同时也支持嵌套使用models.Book.objects.filter(Q(id__gt=2)&(Q(color='as') | Q(title='C')))#~代表非models.Book.objects.filter( ~Q(color='as'))
admin
python manage.py createsuperuser
汉化
settings 设置LANGUAGE_CODE = 'zh-Hans'TIME_ZONE = 'Asia/Shanghai'
models.py
verbose_name='' #在admin页面显示的列名editable=False 该数据不可更改
admin.py
list_display('title','price')#在admin页面显示的的列search_fields=('title',) # 添加一个搜索框 根据'title'进行搜索list_fields('title',) #添加一个过滤器 ,根据'title'进行过滤
- django orm总结
- django orm总结
- django orm总结
- Django orm总结
- Django---ORM总结
- django orm
- django ORM
- Django ORM
- [Django]外部调用django orm
- Django ORM涉阶(一)
- Django ORM涉阶(二)
- 深入django :自定义ORM
- django orm排序
- django orm操作练习
- Django-ORM(一)
- Django ORM 操作
- Django-ORM基础操作
- django orm反查
- Maven系列--"maven-source-plugin"的使用
- JSP的EL表达式中默认数据域及取值方式
- Maven项目创建注意事项
- 解决Android中No resource found that matches android:TextAppearance.Material.Widget.Button.Inverse问题
- MYSQL 5.7 压缩版环境配置小计
- Django---ORM总结
- 设计模式
- 常用的 Eclipse 开发快捷键技巧
- Mybatis的配置文件
- oralce 提高查询效率 给条件字段添加索引 sql
- 关于mac os终端输入密码没反应的问题
- mysql 索引总结
- fit_transform的一点小姿势
- 关于线程安全的记录以及python GIL